結城浩のHaskell日記 RSSフィード

2006-05-28

練習問題 練習問題 - 結城浩のHaskell日記 を含むブックマーク

練習問題。

  • 1. printとputStrLnを間違えた。計算が合わないのはWindowsのCR LFのせいだと推測。
  • 2. たぶん正解。

答え合わせ。

  • 1. 2.とも、もっと簡単に書けた…。

次はp.56から。

reverse関数 reverse関数 - 結城浩のHaskell日記 を含むブックマーク

ghciで動かして練習。

Prelude> reverse "abc"
"cba"
Prelude> reverse [1, 2, 3, 4, 5]
[5,4,3,2,1]
Prelude> take 3 (reverse [1,2,3,4,5])
[5,4,3]
Prelude> reverse (take 3 (reverse [1,2,3,4,5]))
[3,4,5]
Prelude> reverse $ take 3 $ reverse [1,2,3,4,5]
[3,4,5]

unlines関数とtake関数 unlines関数とtake関数 - 結城浩のHaskell日記 を含むブックマーク

ghciで動かして練習。

> ghci
Prelude> unlines [1, 2, 3]

<interactive>:1:
    No instance for (Num String)
      arising from the literal `1' at <interactive>:1
    In the list element: 1
    In the first argument of `unlines', namely `[1, 2, 3]'
    In the definition of `it': it = unlines [1, 2, 3]
Prelude> unlines ["1", "2", "3"]
"1\n2\n3\n"
Prelude> unlines ["", "", ""]
"\n\n\n"
Prelude> take 2 ["a","b","c","d"]
["a","b"]
Prelude> unlines $ take 2 $ lines "a\nb\nc\nd\n"
"a\nb\n"
Prelude> :q
Leaving GHCi.

「ふつける」p.48まで読んだ。さくさく読める。

名前の付け方 名前の付け方 - 結城浩のHaskell日記 を含むブックマーク

そういえば、getContentsとか、putStrというのもCamelCaseっていうのだろうか。

lines関数の練習 lines関数の練習 - 結城浩のHaskell日記 を含むブックマーク

> ghci
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.2.2, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base ... linking ... done.
Prelude> lines "abc\ndef\nghi\n"
["abc","def","ghi"]
Prelude> length (lines "abc\ndef\nghi\n")
3
Prelude> length $ lines "abc\ndef\nghi\n"
3
Prelude> :q
Leaving GHCi.

length関数の練習 length関数の練習 - 結城浩のHaskell日記 を含むブックマーク

> ghci
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.2.2, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base ... linking ... done.
Prelude> length ""
0
Prelude> length "abcdef"
6
Prelude> length ["a","b","c"]
3
Prelude> :q
Leaving GHCi.

第二章に入りました 第二章に入りました - 結城浩のHaskell日記 を含むブックマーク

さて、メタな話はそのくらいにして、夕食まで「ふつける」(ふつうのHaskellプログラミング)を読み進めることにする。第二章に入った。

  • 関数を適用するということ
  • アクション
  • cat.hsを写経してコンパイルして動かした。OK。手軽にexeが出来るのはよいかも。exeサイズもそんなに大きくない。
  • putStrLn関数とputStr関数
  • レイアウト、オフサイドルール
  • do式。上から下に実行。
  • 「変数を値に束縛する」これ、いまでも悩む。「変数に値を束縛する」のじゃないかって気がして。
  • 変数束縛と <-

ピザが来た。次はp.36から。

…食事…

ピザ食べました。ピザ食べながら超準解析の解説書を見ていたらモナドという言葉が出てきてびっくり。

それはさておき勉強を続けます。

  • 文字列は文字のリスト
  • countlines.hsを写経してコンパイルして動かした。OK。

次はp.44から。

haskellグループの運営について考えました haskellグループの運営について考えました - 結城浩のHaskell日記 を含むブックマーク

追記:このエントリの内容は古くなりました。最新状況はhaskellグループの運営について、もっと考えましたをお読みください。

id:babieさんの開放的・閉鎖的というエントリより。

結城さんが Haskell の勉強を始めた。そのこと自体は何も問題ないんだけど、Haskell という一般名称のグループを一人で占有してることが気になる。g:naoya みたいなものだったらわからんでもないけど。はてなはネットの一部に過ぎないけれど、それでも万単位のユーザーがいる。これから Haskell が盛り上がってもはてなグループを作ることは叶わないということだ。ネットは早い者勝ちなんでしょうがないっちゃしょうがないんだけど。

ふむふむ。

Haskellそのものとは関係ないけれど、私がたどった考えを少し書いてみますね。私の考えが正しいかどうか、というよりも、どんなことを考えたかをオープンにするために。

  • RubySchemeをWebで勉強するのは楽しいと思った。
  • こんどはHaskellをやってみよう。
  • 自分のサイトで勉強するのもいいけれど、「はてな」だといろんな人の反応ももらいやすいな。
  • 自分の「結城浩のはてな日記」でカテゴリ分けをしてやってもいいけれど、一つの日記にテーマが混在すると、リングにも入りにくいな。
  • だから独立した「はてな日記」をもちたいな。
  • id:rubycoのときにはサブアカウントを使った。でもサブアカウントはあと一つしかない。
  • 日記を持つ機構として、はてなグループがあるなあ。
  • 規約を見ても一人で使ってはいけなくはないようだ。
  • SICPの勉強のときにはsicpというグループにしたけれど、結局はSchemeの勉強がメインだった。
  • 「ふつける」を読むにしても、Haskellの勉強になるから、グループはHaskellの名前にしたほうがよいかな。
  • rubyのときには「rubycoさん」にしたけれど、Haskellならなんだろう。Haskeller? Haskellish? Haskello? ううーん。
  • あ、Haskellを勉強しているグループがすでにあったりするかな。探してみよう。…ないのか。

…というのが、haskellというはてなグループを、日記の場所として確保させていただく経緯でした。

babieさんが書かれているような、

人を信用しないことで、自分の・他人の・コミュニティの・コミュニケーションの・コラボレーションの可能性を閉ざしてるように感じるから、苛立つ。

という感じは、結城自身も実はある程度はわかっているつもりです。g:haskellに関していえば「どうせhaskellという一般名称を使うなら、もっと他の人に門戸を開いた状態のグループにしてほしい。もしそうしないのであれば、もう少し一般名称じゃない名前にしてほしい」ということでしょうか。

なかなか難しいですね。何を難しがっているかを順不同で列挙してみます。

  • 内容はhaskellに特化したものになるので、haskellという名前を使いたい。
  • でも確かに一人でその名前を占有すると言えなくはない。
  • かといって、広く門戸を開いたグループを運営する余裕はない。
  • けれども、もしHaskellの盛り上がりに水を差すというのならそれはそれで本意ではない。
  • でもでも、「えー、せっかくHaskellのグループを運営しようと思ったのになあ」という人から指摘されるならわかるけれど、結局haskellというグループが作られないとしたら、何だかつまらないような気もする(つまり、babieさんがg:haskellを運営したいわけじゃないんですよねということ)。2006-05-29修正:これを書いたときはこう感じたんだけれど、考え直してみると言い過ぎたように思いますので、削除します。誰が言ったかはあまり重要じゃないと思い直しました。

ということで、だいぶ考えがまとまってきました。暫定的にこういう宣言をしてみましょう。

結城は現在のところg:haskellを一人で自分用のHaskell勉強の日記スペースとして使っており、グループへの参加者を増やすつもりはありません。

でも、もしも「人を増やしても大丈夫。g:haskellの管理者は私がやりますから」という人が出てきましたら、その人に管理権限を委譲します。

このように宣言することで、

  • g:haskellが使われることでHaskellの認知を高めるのに(いささか)貢献する
  • g:haskellの門戸を開く管理者が現れれば、広かれたはてなグループとして運用される
  • それまでは結城一人で使わせていただく

ということが実現できると思います。よろしくどうぞ!

追記:管理者をやりたいという方は「結城浩Haskell日記」のコメント欄に書き込むのがもっとも確実な連絡方法だと思います。

href href - 結城浩のHaskell日記 を含むブックマーク

処理系は以上でOK。次はリファレンスマニュアルだな。青木さんのhrefを入れてみよう。

ダウンロードして、href-0.3.1.tar.gzをgunzipして、tar xvfで展開。

C:\work\href-0.3.1>nmake
        ghc -cpp --make -package network href.hs -o href
Chasing modules from: href.hs
Compiling PathUtils        ( ./PathUtils.hs, ./PathUtils.o )
Compiling Utils            ( ./Utils.hs, ./Utils.o )
Compiling HrefDatabase     ( ./HrefDatabase.hs, ./HrefDatabase.o )
Compiling Main             ( href.hs, href.o )
Linking ...
        ghc -cpp --make -package network mkhref.hs -o mkhref
Chasing modules from: mkhref.hs
Skipping  PathUtils        ( ./PathUtils.hs, ./PathUtils.o )
Skipping  Utils            ( ./Utils.hs, ./Utils.o )
Skipping  HrefDatabase     ( ./HrefDatabase.hs, ./HrefDatabase.o )
Compiling Main             ( mkhref.hs, mkhref.o )
Linking ...

C:\work\href-0.3.1>set HREF_DATADIR=C:/work/href-0.3.1

C:\work\href-0.3.1>mkhref ref/*.*

C:\work\href-0.3.1>href
Control.Exception Control.Monad Data.Char Data.List Data.Maybe
Data.Tuple System.Directory System.Environment System.IO Text.Regex

href putStrLnだと、EUCらしく文字化けするのでmoreで自動変換させることにする。

C:\work\href-0.3.1>href putStrLn | more
System.IO.putStrLn
putStrLn :: String -> IO ()    PRELUDE
putStrLn str

    文字列 str と改行を標準出力 (stdout) に出力する。

    see also: putStr, hPutStr, hPutStrLn

        -- Hello, World プログラム
        main = putStrLn "Hello, World!"

SICPのときのように、info.batというバッチファイルを作っちゃえ。

> type info.bat
@echo off
set HREF_DATADIR=C:\work\href-0.3.1
if "%1"=="" goto USAGE
C:\work\href-0.3.1\href %1 | more
goto END
:USAGE
echo info function
:END

試してみよう。

> info putstrln
System.IO.putStrLn
putStrLn :: String -> IO ()    PRELUDE
putStrLn str

    文字列 str と改行を標準出力 (stdout) に出力する。

    see also: putStr, hPutStr, hPutStrLn

        -- Hello, World プログラム
        main = putStrLn "Hello, World!"



> info put
System.IO.putStr
System.IO.putStrLn


> info p
Data.List.partition
Data.List.product
System.IO.print
System.IO.putStr
System.IO.putStrLn

ふむふむ、いい感じ。

ghci ghci - 結城浩のHaskell日記 を含むブックマーク

ghciというのもあるのか。

> ghci
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.2.2, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base ... linking ... done.
Prelude> putStrLn "Hello!"
Hello!

Prelude> :q
Leaving GHCi.

Helloから Helloから - 結城浩のHaskell日記 を含むブックマーク

半写経。

> type hello.hs
main = putStrLn "Hello!"
> ghc hello.hs -o hello
> hello
Hello!

Glasgow Haskell Compiler Glasgow Haskell Compiler - 結城浩のHaskell日記 を含むブックマーク

まずは処理系。『ふつける』ではGHCを使うのでGHCをインストール…と思ったけれど、考えてみればすでに以前インストールしていた。

バージョンチェック。

> ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.2.2

ogijunogijun2006/05/28 18:24id:babieさんのように言語化できませんでしたが、同じような感想を持っていました。
こちらのhaskellグループについては、結城さんの意図がよくわかりました。同じように、sicpグループについても方針をお聞かせいただけないでしょうか。

hyukihyuki2006/05/28 18:37あ、そうですね。同じようにしておきましょうか。