[英]Is Haskell's `Const` Functor analogous to the constant functor from category theory?
[英]Are `join` and `fmap join` equals in Haskell (from Category theory point of view)?
我的問題來自Haskell的monad的第一定律: join . fmap join = join . join
join . fmap join = join . join
join . fmap join = join . join
。
在Haskell / Category_theory中,該法律由以下圖片證明:
我對這個例子使用類型的實例而不是類型的事實感到困惑。 因為Hask
類中的對象是類型,而不是它們的實例。
在該圖中,兩個箭頭( join
和fmap join
)都導致M(M(X))
。 這是同一個對象,還是有兩個不同的M(M(X))
?
我對這個例子使用類型的實例而不是類型的事實感到困惑。 因為Hask類中的對象是類型,而不是它們的實例。
該示例使用類的實例, 該類本身就是一個類型 。
在Haskell中,是的,這是同一個對象(類型)。 Monad
類型類的實例必須是類型構造函數,類型構造函數是單射的。 那么,應該很清楚
X = X => M(X) = M(X) => M(M(X)) = M(M(X))
這里的問題是,這只意味着它們是相同的類型,而不是價值。 僅僅因為fmap join
和join
都可以將它們的類型專門用於Monad m => m (m (ma)) -> m (ma)
並不意味着它們做同樣的事情。
他們沒有。
ghci> (fmap join) [[[1],[2],[3]]]
[[1,2,3]]
ghci> join [[[1],[2],[3]]]
[[1],[2],[3]]
並非所有類別的圖紙都必須最終成為通勤圖。 :)
從圖片中,您可以看到fmap join
和join
產生相同類型的 不同值。 因此,它們是不相同的,即使它們與組合物 join
最終產生相同的值。
在范疇論中,同態性是一種態射g
,使得f1 . g == f2 . g
f1 . g == f2 . g
f1 . g == f2 . g
意味着f1 == f2
也是如此。 在這種情況下,我們可以看到join
不是一個異形,因為雖然fmap join . join == join. join
fmap join . join == join. join
fmap join . join == join. join
, fmap join == join
是不正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.