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で議論したのだが、いまいち納得出来ない。

  • CPSはプログラム構造がぐちゃぐちゃになる。
    • じゃぁCPSモナドは単なる記法上の問題で概念としては同じなのか?
  • でもContinuationモナドってのが有るな
    • モナドは一度実行を移すと最初から最後まで一気に計算が進むけど、継続を使えば脱出したり出来る(逐次的に関数を呼び出す必要が無い)ので継続という概念の方がモナドより柔軟性が有るのではないだろうか?

んー。まぁもう少し勉強しよ。