在Haskell中学习仿函数,应用函子和monad,我在Wikipedia找到了这个定义:
在函数式编程中,特别是Haskell,一个applicative functor是一个结构,就像一个没有连接的monad(return,fmap,join),或者像带有return的functor .
我无法理解:在我看来,将 return
(即 pure
)提供给仿函数并不足以获得一个应用仿函数,因为你需要提供 ap
(即 <*>
),这也不能用 fmap
来定义仅 return
. 我错过了什么或维基百科的定义不是绝对正确的吗?
编辑2017-02-08:我在this答案中找到了关于这个问题的其他有用的见解 .
2 回答
这篇文章不正确 . 假设我们有一个monad
m
没有join
,或者一个带有return
的仿函数 . 我们可以立即定义pure
:但是,我们不能仅使用
fmap
和return
定义(<*>)
. 我们所拥有的只是fmap
,所以如果我们尝试使用m (a -> b)
,我们最终会得到m (m a)
. 那时我们需要join
或等价的(>>=)
:应用程序仿函数就像一个带有
return
和ap
的仿函数,但没有join
. 所以,是的,你是完全正确的,维基百科错过了申请的运作(见the original paper) .顺便说一句,如果你只添加
pure
,你得到pointed functor . 尽管如此,typeclassopedia提供了比维基百科文章更好的概述Applicative
.你是对的,应用函子需要
<*>
以及pure
来获得最小的定义 . 值得注意的是,我们可以从这些中得到fmap
,但是:同样,我们可以从monad获得适用的定义:
您可以查看applicatives仿函数,将仿函数概括为多参数函数,或者将值与水平上下文组合: