monad的表现力是否以代码重用为代价?

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动作,它必须返回一个相同类型的monad
  • 具有ap动作序列由应用程序确定,而使用bindmonadic动作可以确定控制流程

所以monads给了我额外的表现力.但是,由于它们不再接受正常的纯函数,这种表达性似乎是以代码重用为代价的.

我的结论可能有点幼稚甚至错误,因为我对Haskell和monadic计算的经验很少.任何在黑暗中的光都是值得赞赏的!

She*_*rsh 8

如果你有纯粹的功能,g :: a -> b你可以使它成为Applicative版本

pure g :: Applicative f => f (a -> b)

或者Monad是的

pure . g :: Applicative f => a -> f b

因此,您不会丢失任何代码重用.