2015-07-22 69 views
15

這是一個衆所周知的事實,(>>=)可以使用fmapjoinjoin可以實現使用>>=來實現`join`一部分。是否有任何理由我們沒有定義Monad類包含join包括並使用以下默認定義?爲什麼不是`Monad`類

join x = x >>= id 
x >>= f = join $ f <$> x 

這將允許最小定義爲包括要麼只是(>>=)join,而不是強迫(>>=)。考慮到類別理論傾向於支持join,可能會有所幫助。

反對修改類的通常觀點是我們打破向後兼容性。但是,在這種情況下,這種情況不會發生 - 我們只添加使用join來定義Monad的可能性。

+1

就像你說的那樣,'(>> =)= join。 fmap',但在GHC 7.10之前,'Monad'不會自動成爲函子。從這個意義上說,我們在'bind'中定義'join'和'fmap'。實施'>> ='比連接更容易。試着去做,比如解析器/狀態函子。 – AJFarmar

+0

@AJFarmar我不認爲'(>> =)=加入。 fmap'的作品。爭論被翻轉,還有一些其他問題。但好點! – Alec

+0

啊,你是對的,它實際上是(加入)。翻轉fmap',但是這個想法就在那裏,就像你說的那樣。 – AJFarmar

回答

21

這意味着發生在Applicative-Monad proposal(它使GHC 7.10)。然而,在GHC中有a technical issue涉及type roles,它無限期地推遲了你所建議的實現。

+6

這是排除'join'的可怕原因。它應該是Monad類的一部分。 – augustss

+4

@augustss,這是一個*悲傷*的原因,而不是*壞*一個。能夠使用monads的泛型newtype派生和強制是一件好事。 – dfeuer

+1

@dfeuer就像你說的那樣,但可以簡單地定義'join',然後使用標識'(>> =)=(join。)。正如我在上面指出的那樣,翻轉fmap',所以它不是什麼大問題。 – AJFarmar

相關問題