ちなみに

火曜日の空は僕を押しつぶした。

Haskell勉強会#8まとめ

Kanasan.JSと同日の午前中にujihisaさん主催のHaskell勉強会に参加してきました。Haskell歴3日だったのですが、果敢にも挑戦してみました。

範囲は296ページから315ページ。青木さんがこの本のためにHaskellで書かれたWikiエンジンLazyLinesを題材に扱った12章です。

正直、最初っから意味不明の状況。復習の時間があったのですが、そこで出ていた11章のモナドを使って書き直す問題。(>>=)<-これって何?状態から入ったのでかなりきつかったです。しかし、とりあえず'do'を(>>=)(バインドと呼ぶそうです)を使って書き直す方法だけ意味を理解せずに覚えて書いてみるも動かず。そうですね。関数合成をしらなかったのです。
そのあともさっぱり。とりあえず必死にコードを目で追っていました。

よって内容については書ける状態でないので、興味のある方はujihisaさんの記事を参照してください。-> nowa サービス終了のお知らせ

僕は宿題的な意味で、11章の練習問題について自分なりに解釈したものをまとめておきます。理解がまだ不十分なので間違ったことを書いている可能性もあります。コメントなんかで指摘していただければ幸いです。

勉強会でやったのは11章、練習問題の1番で、2章で作ったhead.hsを(>>=)を使って書き直しなさいと言うもの。

以下がそのhead.hs

main = do cs <- getContents
          putStr $ firstNLines 10 cs

fisrstNLines n cs  = unlines $ take n $ lines cs

変数csをgetContentsアクションに束縛して、firstNLines関数を適用したものを表示します。
firstNLines関数はlines関数で改行ごとの文字列のリストに分割したあとに、take関数ではじめのn行、つまりここでは10行を取り出します。最後にunlines関数を適用することによって、再び文字列に戻してそれを返します。
これをモナドと関数合成、部分適用を用いてポイントフリースタイルにします。

main = getContents >>= putStr . firstNLines 10

firstNLines :: Int -> String -> String
firstNLines n = unlines . take n . lines

まずはmain関数からですが、IOモナドを用いてgetContentsアクションを評価した値を、putStr . firstNLines 10 関数に渡しています。これはdo構文からの書き換えの基本ですね。そして値を渡されるputStr . firstNLines 10 関数ですが、これはputStrアクションとfirstNLinesを部分適用したfirstNLines 10関数を(.)で関数合成したものです。青木さんの言葉を借りるならば、「firstNLine10して、putStrsする関数」です。
次に、firstNLines関数を見ます。型は

firstNLines :: Int -> String -> String

と宣言しています。これは、引数にInt型をString型を取りString型を返すと言う意味です。ちなみにInt型は有限の符号付き整数値、String型は[Char]型の別名で文字列のことです。
この関数も関数合成でポイントフリースタイルにしています。そのまま「linesして、take nして、unlinesする関数」です。

勉強会でも言われていたように最重要項目のひつとであるモナドの練習問題としては簡単すぎますね。むしろ他の章の方が難しいかも。しかし、書き換えが出来たからと言って理解しているかというと全くそんなことはなく。本質的なところが全然理解できていないのでしばらくはモナドに取り組みたいと思っています。
次の勉強会(Haskell勉強会#9)が2月22日(金)に予定されているので、ここまでにはしっぽでもいいから掴めるように頑張ります。

心のライバルはsnow-bell(snow-bellの日記)女史で。


追伸:芋きんつばごちそうさまでした。