簡體   English   中英

Haskell中的`join`和`fmap join`是否等於(從類別理論的角度來看)?

[英]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類中的對象是類型,而不是它們的實例。

所以我嘗試用類型重繪這個例子,這里我得到了: 在此輸入圖像描述

在該圖中,兩個箭頭( joinfmap join )都導致M(M(X)) 這是同一個對象,還是有兩個不同的M(M(X))

我對這個例子使用類型的實例而不是類型的事實感到困惑。 因為Hask類中的對象是類型,而不是它們的實例。

該示例使用的實例, 該類本身就是一個類型


在Haskell中,是的,這是同一個對象(類型)。 Monad類型類的實例必須是類型構造函數,類型構造函數是單射的。 那么,應該很清楚

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

這里的問題是,這只意味着它們是相同的類型,而不是價值。 僅僅因為fmap joinjoin都可以將它們的類型專門用於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 joinjoin產生相同類型的 不同值。 因此,它們是不相同的,即使它們與組合物 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. joinfmap join == join是不正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM