2017-01-13 13 views
5

私の質問は、ハスケルのモナドの最初の法則から生じます:join . fmap join = join . join。私は、この例では、型のインスタンスではなく、型を使用しているという事実によって混乱しています`join`と `fmap join`はHaskellと同じです(カテゴリ理論の観点から)?

enter image description here

:この法律は、以下の画像で示されているHaskell/Category_theory

。カテゴリHaskのオブジェクトは型であり、インスタンスではないためです。

だから私は、私が得たものをここにタイプして、この例を再描画しようとした、と: enter image description here

この写真では、両方の矢印(joinfmap join)がM(M(X))につながります。これは同じオブジェクトですか、または2つの異なるM(M(X))がありますか?

答えて

7

この例では、型ではなく型のインスタンスを使用しているということで、私は混乱しています。カテゴリHaskのオブジェクトは型であり、インスタンスではないからです。

例は、タイプ自体でクラスのインスタンスを使用します。


ハスケルでは、これは同じオブジェクト(タイプ)です。 Monad型のインスタンスは型コンストラクタでなければならず、型コンストラクタは注入型でなければなりません。

X = X => M(X) = M(X) => M(M(X)) = M(M(X)) 

ここでキャッチするのは、それらが同じタイプであり値ではないということだけです。 fmap joinjoinは両方ともMonad m => m (m (m a)) -> m (m a)に特化したタイプを持つことができるので、同じことをするわけではありません。

これらはありません。

ghci> (fmap join) [[[1],[2],[3]]] 
[[1,2,3]]   
ghci> join [[[1],[2],[3]]] 
[[1],[2],[3]] 

すべてのカテゴリの図が通勤図になるわけではありません。 :)

+1

私は(ちょうどコメントを参照してください)、結果の構造は同じですが、値はありません。モナド変圧器と比較して、どのモナドの点であるか:「m a」の「a」に影響を与えるが、「m」は残す。 「m」に影響するモナド変圧器と比較して、「a」を残す。 – urbanslug

6

絵から、あなたはfmap joinjoinが同じタイプ異なる値を生成することがわかります。したがって、の組成がjoinであっても、最終的には同じ値が生成されますが、それらは同じではありません。

epimorphismgであり、f1 . g == f2 . gf1 == f2も意味します。この場合、fmap join . join == join. joinですが、fmap join == joinではないので、joinではなく、エピモルフィズムであることがわかります。