我瞭解<$>
的簽名背後的原因,因爲它只是fmap
的中綴版本,但將其與>>=
的簽名類型進行比較,它對我來說意義不大。
我們先來確定一下我的意思。
(>>=) :: Monad m => m a -> (a -> m b) -> m b
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
(<$>) :: Functor f => (a -> b) -> f a -> f b
縱觀類型簽名,我們可以看到,>>=
需要在左邊的值,並在右邊,這讓很多的,如果你考慮它的鏈接財產意義上的功能:foo >>= bar >>= baz
哪讓我想知道,爲什麼<*>
和<$>
也這樣做?你不能寫foo <*> bar <*> baz
,因爲它需要foo <*> bar
的輸出是一個函數,而不是一個值。
我知道<**>
和=<<
存在兩個翻轉參數的順序,讓我做這樣的事情:
Just 4 <**> pure (+3) <**> pure (*2) >>= (\x -> Just (x-3))
這本來是精美減少到:
Just 4 <$$> (+3) <$$> (*2) >>= (\x -> Just (x-3))
如果<$$>
已經存在,或者如果參數順序<$>
和<*>
已被顛倒過來。
另一件讓我想知道爲什麼這種差異存在的原因是它讓新手很難習慣和/或記住它是功能還是先看到的價值,而不必去查找它。
那麼,爲什麼在中<*>
和<$>
的情況下,它是fn op val
但>>=
它的val op fn
?
但你經常需要的正是這種與'Applicatives' :例如'(+)<$>只是5 <*>只是5 '< - 不是'只是'美麗;) – Carsten 2014-09-24 11:27:58
'(>> =)'構造鏈條「勢在必行的風格」(否則我們會留下奇怪的原因它不是與'$'相同的順序)。 '(<= <)'也允許鏈接 - 「'(。)'style」。 '(<*>)'對於「應用」多參數函數很有用 - 按照聲明的順序提供參數。 – 2014-09-24 11:31:59
真正的問題是爲什麼'(>> =)'使用與Haskell中幾乎所有對象相反的順序。 (= <<):: Monad m =>(a - > mb) - >(ma - > mb)'的類型看起來更像Haskell中的所有其他部分,而非'(>> =)= flip = <<)'。 – 2014-09-25 09:51:40