在试图更好地理解 Applicative 的同时,我查看了 的定义,它往往被定义为 ap,而 ap 又被定义为:
ap :: (Monad m) => m (a -> b) -> m a -> m b
ap = liftM2 id
查看 liftM2 和 id 的类型签名,即:
liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
id :: a -> a
我无法理解仅仅通过传递 id,类型签名的相关部分似乎就从(a1 -> a2 -> r) -> m a1
to m (a -> b)
。我在这里缺少什么?
类型变量a
from id
可以以任何类型实例化,在本例中该类型是a -> b
.
所以我们正在实例化id
at (a -> b) -> (a -> b)
。现在是类型变量a1
from liftM2
正在实例化于(a -> b)
, a2
正在实例化于a
, and r
正在实例化于b
.
综合起来,liftM2
被实例化于((a -> b) -> (a -> b)) -> m (a -> b) -> m a -> m b
, and liftM2 id :: m (a -> b) -> m a -> m b
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)