« HaskellでBrainf*ck |Main| モナドを作るver. 0.1 »

« Haskellのモジュールがよくわからない日記 | zakki(雑記) | モナドを作るver. 0.1 »

モナドはごちそうさま日記

問い。下の2行が同じ出力になるようにjoinを定義しなさい。
-- main = putStr $ unlines $map show [1..5]

main = join (map print [1..5])

IO()だから()を捨てても問題がないわけだな、とか。 元からモナドだからreturnしなくていいんだな、とか。 >>=はモナドとモナドを直接つなぐことはできないんだな、とか。 つなぎ目の形を合わせるために間にラムダを挟むんだなぁ、とか。

解答。

join :: (Monad m) => [m a] -> m a
join [x] = x
join (x:xs) = x >>= (\a -> (join xs))

ようするに、どこでも節操なくIOできるPythonとかと違って、 Haskellは最終的にmain::IO()がIOするので、 IOするモナドをつなぎ合わせて大きなモナドにしてmainに入れてやるしかない。

「モナド」「モナド」と言葉が一人歩きしているけど、そのモナドって どういうたぐいのものなのか。 モナドというデータ型なのか、モナドという制御構造なのか、 モナドというデザインパターンなのか。

MonadはEqやOrdと同じたぐいの「型クラス」で、Javaにたとえるならインターフェイス。 JavaでRunnableをimplementsしないとスレッドで実行できないのと同じで、 HaskellではMonadをinstanceしないとIOできない。

「Monadのインスタンスはbindやreturnをモナド則に従って実装せねばならない」 ということが大げさに感じられるけども、 Eqのインスタンスだって==をいろんな法則に従うように実装しないといけない。 まず「x == x」が常にTrue。次に「x == yがTrueの時、y == xは常にTrue」。 最後に「x == yがTrueで、y == zもTrueの時、x == zは常にTrue」。

Eqが満たすべき法則を書いてみると、当たり前すぎて何を今更という感じがする。 でもこの法則を満たさない==を実装したら、いろいろなアルゴリズムが予定外の挙動をするだろう。 モナドがモナド則を満たさないといけないのも同じこと。 モナド則を満たしていると仮定して他のアルゴリズムが実装されているので、 そのルールを守りましょう、ということ。


= さて、モナドがわかった気分になったところで、僕はそろそろ執筆に戻らなきゃ。 柴田さんいわく、執筆はマラソンとのことで、 この2,3日Haskellというおもちゃにどっぷりはまってしまった僕はたとえていうなら、 マラソンの最中にミスタードーナツに入ってエンゼルクリーム(モナド)を食べて一服していたら、 なかなか走り出せなくなってしまったような状態。

まず靴を履いて、外に出て、ゆっくりでも進まなきゃ。 まずは今までに書いた原稿を音読。

はっ。ミスタードーナツは略してミスドか。 モナドはモナードーナツか。 なんかすでにAAまでありそう。

はてぶのコメント

モナドナルドかもしれないと思った
なるほど。モナドナルド。たしかにそれもあり。

関東人はモッナとか略すんだろう。 名前がモナで名字がドナルドだとか思ったら大間違いだ!


= /halt/Snapshot - 先月予約したものが届いた おおお、売ってるものだったのか。

Amazon.co.jp: THE JAPANESE TRADITION ~日本の形~: DVD: ラーメンズ,NAMIKIBASHI,斉木しげる,山咲千里。 そして見たことのない動画がいっぱいあるっ。 これはっ。

YouTubeで見られる「鮨」や「土下座」はオフィシャルに公開しているものだそうな。 あれだけしかアップされてないからてっきりあれだけしかないものと勘違いしていた。

我々日本人は自国の文化についてもっと知るべきである
大賛成。
= やりかけた作業を明日の自分に伝えるメモ。 一段落付くところまでやり終えて(朝の5時とかになって)疲れて寝るのではなく、 次にやることが見えている状態でやめるのがいい。 …って誰かが書いていた。

ぐぐったけど誰が言ったのかわからなかった。 でも生産性向上のテクニックとして有名なようだ。

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/537

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.