5 monads haskell functional-programming dry reusability
当我比较Applicative和Monad类型的二进制操作时
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
(=<<) :: Monad m => (a -> m b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)
两个差异变得明显:
ap期望一个正常的纯函数,而bind期望一个monadic动作,它必须返回一个相同类型的monadap动作序列由应用程序确定,而使用bindmonadic动作可以确定控制流程所以monads给了我额外的表现力.但是,由于它们不再接受正常的纯函数,这种表达性似乎是以代码重用为代价的.
我的结论可能有点幼稚甚至错误,因为我对Haskell和monadic计算的经验很少.任何在黑暗中的光都是值得赞赏的!
如果你有纯粹的功能,g :: a -> b你可以使它成为Applicative版本
pure g :: Applicative f => f (a -> b)
或者Monad是的
pure . g :: Applicative f => a -> f b
因此,您不会丢失任何代码重用.