haskell 函数签名

标签 haskell signature type-variables

我对haskell中的类型签名有疑问。阅读有关应用仿函数的内容,我发现:

pure (+) <*> Just 3 

返回 Just (+3)类型为 Maybe (a->a) .现在签名<*>
 (<*>) :: Applicative f => f (a -> b) -> f a -> f b

这意味着我们的 f b在上面的例子中是通过替换 f 获得的与 Maybeba->a .

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

这可能只是因为我们在内部和应用仿函数还是我缺少的其他东西?

最佳答案

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

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

关于haskell 函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14583197/

相关文章:

haskell - 在函数式响应式(Reactive)编程中,如何在应用程序的两个部分之间共享状态?

c - 尝试在 OS X 10.9 中编译 Haskell 程序时的警告

java - Google Cloud Storage - 表单上传(POST OBJECT)、签名和策略问题

java - 如何在 Frege 中声明带有类型变量的 native 接口(interface)?

haskell - 如何在 Haskell 中正确使用一元表达式而不会出现解析错误?

php - 在 PHP 中验证签名的 PDF 文档

authentication - apt-get install quiet 和 --assume-yes 但检查包是否已签名

java - 类型变量的不相关默认继承错误 : why?

haskell - GHCi 如何为类型变量选择名称?

haskell - 如何为此 GADT 编写序列化实例?