微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

算法 W或 Haskell中的函数参数不是多态的吗?

如何解决算法 W或 Haskell中的函数参数不是多态的吗?

我正在为一种玩具语言实现 Algorithm W。我遇到了一个我认为会进行类型检查的案例,但事实并非如此。我在 Haskell 中尝试了同样的方法,但令我惊讶的是,它在那里也不起作用。

> (\id -> id id 'a') (\x -> x)
Couldn't match type ‘Char -> t’ with ‘Char’
Expected type: Char -> t
Actual type: (Char -> t) -> Char -> t

我认为 id 是多态的,但似乎不是。请注意,如果 id 是使用 let 而不是作为参数传递来定义的,则此示例有效:

let id x = x in id id 'a'
'a'
:: Char

在查看算法 W 的推理规则时,这是有道理的,因为它具有 let 表达式的泛化规则。

但我想知道这是否有任何原因?不能把函数参数也泛化一下,多态使用吗?

解决方法

泛化 lambda 绑定变量的问题在于它需要更高等级的多态性。举个例子:

(\id -> id id 'a')

如果这里id的类型是forall a. a -> a,那么整个lambda表达式的类型一定是(forall a. a -> a) -> Char,属于2阶类型。

除了这个技术点之外,还有一种观点认为较高等级的类型非常不常见,因此与其推断出非常不常见的类型,不如说用户更可能犯了错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。