2006-05-28
■ 練習問題 
練習問題。
- 1. printとputStrLnを間違えた。計算が合わないのはWindowsのCR LFのせいだと推測。
- 2. たぶん正解。
答え合わせ。
- 1. 2.とも、もっと簡単に書けた…。
次はp.56から。
■ reverse関数 
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関数 
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まで読んだ。さくさく読める。
■ 名前の付け方 
そういえば、getContentsとか、putStrというのもCamelCaseっていうのだろうか。
■ lines関数の練習 
> 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関数の練習 
> 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プログラミング)を読み進めることにする。第二章に入った。
- 関数を適用するということ
- アクション
- cat.hsを写経してコンパイルして動かした。OK。手軽にexeが出来るのはよいかも。exeサイズもそんなに大きくない。
- putStrLn関数とputStr関数
- レイアウト、オフサイドルール
- do式。上から下に実行。
- 「変数を値に束縛する」これ、いまでも悩む。「変数に値を束縛する」のじゃないかって気がして。
- 変数束縛と <-
ピザが来た。次はp.36から。
…食事…
ピザ食べました。ピザ食べながら超準解析の解説書を見ていたらモナドという言葉が出てきてびっくり。
それはさておき勉強を続けます。
- 文字列は文字のリスト
- countlines.hsを写経してコンパイルして動かした。OK。
次はp.44から。
■ haskellグループの運営について考えました 
追記:このエントリの内容は古くなりました。最新状況はhaskellグループの運営について、もっと考えましたをお読みください。
結城さんが Haskell の勉強を始めた。そのこと自体は何も問題ないんだけど、Haskell という一般名称のグループを一人で占有してることが気になる。g:naoya みたいなものだったらわからんでもないけど。はてなはネットの一部に過ぎないけれど、それでも万単位のユーザーがいる。これから Haskell が盛り上がってもはてなグループを作ることは叶わないということだ。ネットは早い者勝ちなんでしょうがないっちゃしょうがないんだけど。
ふむふむ。
Haskellそのものとは関係ないけれど、私がたどった考えを少し書いてみますね。私の考えが正しいかどうか、というよりも、どんなことを考えたかをオープンにするために。
- RubyやSchemeを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 
処理系は以上で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というのもあるのか。
> 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.
こちらのhaskellグループについては、結城さんの意図がよくわかりました。同じように、sicpグループについても方針をお聞かせいただけないでしょうか。