我对haskell中的类型签名有疑问。阅读有关应用仿函数的内容,我发现:
pure (+) <*> Just 3
返回
Just (+3)
类型为 Maybe (a->a)
.现在签名<*>
是 (<*>) :: Applicative f => f (a -> b) -> f a -> f b
这意味着我们的
f b
在上面的例子中是通过替换 f
获得的与 Maybe
和 b
与 a->a
.在这里我有点惊讶,因为据我所知,
b
无法统一(对不起,如果我没有使用指定的术语,但我希望它们足够清楚)与 a->a
.这可能只是因为我们在内部和应用仿函数还是我缺少的其他东西?
最佳答案
b
是一个(n 无约束)类型变量,因此它可以与每种类型统一,始终。与Applicative
无关仿函数,它适用于类型变量必须与类型统一的任何地方。
粗略地说,统一两个类型表达式会产生最通用的类型表达式,它不比统一的任一伙伴更通用。如果这两种类型的表达式中的一种比另一种更一般,则统一总是成功并导致统一的更具体的合作伙伴。所有类型表达式中最通用的是一种完全没有任何结构的类型变量。因此,通过用该类型表达式实例化类型变量,可以将类型变量与任何类型表达式统一(假设种类匹配,种类为 *
的类型变量当然不能与类型表达式 Maybe
统一是 * -> *
)。
关于haskell 函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14583197/