我是新來函數式編程(來自JavaScript),我很難說出兩者之間的差異,這也與我對函子與單子的理解混淆。fmap和bind之間的差異?
函子:
class Functor f where
fmap :: (a -> b) -> f a -> f b
單子(簡化):
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
fmap
接受一個函數和一個仿函數,並返回一個算符。>>=
需要一個函數和一個monad,並返回一個monad。
兩者之間的區別是在功能參數:
fmap
-(a -> b)
>>=
-(a -> m b)
>>=
需要一個返回單子一個函數參數。我知道這很重要,但我很難看出這個輕微的東西讓單子變得比仿函數強大得多。有人可以解釋嗎?
這更容易看到翻轉版本的'(>> =)',['(= <<)'](https://stackoverflow.com/questions/34545818/is-monad-bind-operator-近到功能的組合物鏈連接有或functi/34561605#34561605)。使用'(g <$>):: f a - > f b',函數'g :: a - > b'不會影響'f''包裝「 - 不會改變它。用'(k = <<) :: m a -> mb',函數'k :: a - > mb'本身*創建新的''m''包裝「,所以它可以改變。 –
@WillNess我可以」理解「這一點,但是我我認爲我真正的問題是我看不到'>> ='可以做到'fmap'不能做什麼,在我的腦海中它們是相同的,因爲我沒有看到一個例子,它顯示fmap是不夠的, – m0meni
使用列表,嘗試使用'map'過濾掉列表中的某些元素,但不能使用'concatMap',但可以:'map(\ x- > x + 1)[1,2,3]'vs'concatMap(\ x-> [x,x + 1 | even x])[1,2,3])''。 –