Haskell : CPSとモナドの違いは?
調子に乗って始めてしまった。oxy先生の、"パーツを繋いで、最後に電流を流すようなイメージだなぁ>モナド"というアドバイスによってモナドはなんとなく理解出来た。やっぱりLisp系言語の教養が有ったらかなり読みやすい。モナドにおいて重要なのは、bindの動作。
[01:48] <kzk> bindの動作(僕のイメージ)。 [01:49] <kzk> まず、定義はm a -> (a -> m b) -> m b [01:49] <kzk> m a : aをモナドでラップ [01:49] <kzk> a -> m b : aからモナドでラップされたbを作り出す計算 [01:49] <kzk> m b: bをモナドでラップ [01:49] <kzk> つまり、 [01:50] <kzk> モナドでラップしたaを渡すと、そのaを取り出して計算し新しく出来た値bをまたモナドでラップして次に渡す [01:50] <kzk> という感じかなぁ。
つまり、何か(consセルでもいいし、lambdaでも何でもよい。)でラップしたモノを次々と渡して行って、ラップされたものに対して処理をするような関数を並べておいて、結果をまたラップして次に渡すと(分かり難いな...)。
とりあえずここまでは理解出来たのだけれども、CPSとの違いが良く分からない。CPSも次に実行する計算を渡していくという意味では、”パーツを繋ぐ”という意味に合致すると思うのだが。しばらくIRCで議論したのだが、いまいち納得出来ない。
んー。まぁもう少し勉強しよ。