2012-10-13 4 views
6

私はほとんど実用的な人ですが、私はこのことが面白いと思います。機能的プログラミングにおけるシーケンスの理解

私はモナディックシーケンシングについて考えていましたが、私は明確にする必要があるものがいくつかあります。 だからここ を愚かな響きの危険にさらされて、それは次のとおりです。

モナドメンバーバインド

bind :: m b -> (b -> m c) -> m c

はあなたの中間値への明示的なアクセスを与える「アクション」を順序付けることができます。

これは私にカテゴリメンバー(.)より与えない方法:これにより

(.) :: cat b c -> cat a b -> cat a c

を私は順序と中間値へのアクセスを得ることができます。 すべての後に(f . g) x = f(g (x))

(.)と順序付けることができる場合、なぜシーケンシングにはbindが必要ですか?

+3

'' 'である(> =>)::モナドM =>( - > MB) - のモナドバージョン(。)>(B - > MC ) - >(a - > mc) '、Kleisli構成。 –

+4

これは実際にあなたに* less *を与えます。 'C(a、b)= a - > m b'は' bind 'を構成要素とし、 'return'をアイデンティティとする* Kleisliカテゴリ*を 'm'とする。 –

+4

'f(g x)'では 'g x'が最初に起こらなければならないということは、まったく真実ではありません。これは厳密なセマンティクスの下でのみ真実である。しかし、それが現れている間、それは前に、中にあってもいなくてもよい。 – Ingo

答えて

14

あなたは正しい道を歩いています。すべてのモナドは、いわゆるKleisli categoryを発生させます。すべてのモナドmそれに対応するクライスリ圏は矢印a -> m bを持っており、彼らは

f >=> g  = \x -> f x >>= g 

Kleisli型はHaskellの型システムでこれをカプセル化するように定義されて>=>を、使用して構成することができるために、あなたはそれがインスタンス

instance Monad m => Category (Kleisli m) where 
    id = Kleisli return 
    (Kleisli f) . (Kleisli g) = Kleisli (g >=> f) 
を持っていることがわかります

したがって、このカテゴリ内のシーケンシング計算は、>=>を使用するシーケンシング操作です。これは、>>=を使用して同等に表現できます。

return>>=を使用してモナドを定義する方が便利なので、return>=>を使用して定義することもできます。

(またmy answerDifferent ways to see a monadにを参照)。

+4

私は入力していましたが、あなたは私にそれを打つので、Monadの法則は、「Kleisli m」というカテゴリを構成する法則と同等であるということを付け加えます:身分の左右の吸収と合成の結合性。 'ArrowApply'は、' Arrow'がモナドを生成しなければならない余分な構造体を定義していることにも注意してください。 'Kleisli m 'は単なるカテゴリーではなく「Arrow」であり、もちろんArrowApply構造を持っていますが、すべてのArrowではできません。 – pigworker

+0

@pigworker:余分な '(g> => h)を追加する必要があるという点で、法律は100%同等ではありません。 f =(f.g)> => h'法則を導出し、 '> =' '法則から' '=' '法則を導き出す。私はこれが何と呼ばれているのか覚えていないが、いくつかの演習をするときに私を捕まえた。 – hugomg

関連する問題