4

我对haskell中的类型签名有疑问。阅读应用函子,我发现:

pure (+) <*> Just 3 

它返回Just (+3)了类型 Maybe (a->a)。现在的签名<*>

 (<*>) :: Applicative f => f (a -> b) -> f a -> f b

这意味着我们f b在上面的例子中是fMaybeb替换得到的a->a

在这里我有点惊讶,因为据我所知,b无法统一(对不起,如果我没有使用指定的术语,但我希望它们足够清楚)与a->a.

这是否可能仅仅因为我们在内部和应用函子中,或者我还缺少其他东西?

4

2 回答 2

11

b是一个(n 无约束的)类型变量,因此它可以始终与每种类型统一。它与函子无关Applicative,它适用于类型变量必须与类型统一的任何地方。

粗略地说,统一两个类型表达式会产生最通用的类​​型表达式,它不比统一的任何一个伙伴更通用。如果两种类型表达式中的一种比另一种更通用,则统一总是成功并产生更具体的统一伙伴。所有类型表达式中最通用的是一个根本没有任何结构的类型变量。因此,可以通过使用该类型表达式实例化类型变量来将类型变量与任何类型表达式统一(如果种类匹配,其种类为的类型变量*当然不能与Maybe种类为的类型表达式统一* -> *)。

于 2013-01-29T13:04:10.380 回答
7

:t pure (+)

pure (+) :: (Num a, Applicative f) => f (a -> a -> a)

注意f(a -> a -> a)

所以既然:t (<*>)

(<*>) :: Applicative f => f (a -> b) -> f a -> f b

f ( a -> b)实际上是一个f ( a -> a -> a)

所以b这种情况下的类型变量 a -> a

于 2013-01-29T12:55:41.543 回答