這是一個衆所周知的事實,(>>=)
可以使用fmap
和join
而join
可以實現使用>>=
來實現`join`一部分。是否有任何理由我們沒有定義Monad
類包含join
包括並使用以下默認定義?爲什麼不是`Monad`類
join x = x >>= id
x >>= f = join $ f <$> x
這將允許最小定義爲包括要麼只是(>>=)
或join
,而不是強迫(>>=)
。考慮到類別理論傾向於支持join
,可能會有所幫助。
反對修改類的通常觀點是我們打破向後兼容性。但是,在這種情況下,這種情況不會發生 - 我們只添加使用join
來定義Monad
的可能性。
就像你說的那樣,'(>> =)= join。 fmap',但在GHC 7.10之前,'Monad'不會自動成爲函子。從這個意義上說,我們在'bind'中定義'join'和'fmap'。實施'>> ='比連接更容易。試着去做,比如解析器/狀態函子。 – AJFarmar
@AJFarmar我不認爲'(>> =)=加入。 fmap'的作品。爭論被翻轉,還有一些其他問題。但好點! – Alec
啊,你是對的,它實際上是(加入)。翻轉fmap',但是這個想法就在那裏,就像你說的那樣。 – AJFarmar