我正在为一种玩具语言实现算法 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 表达式的泛化规则。
但我想知道这是否有任何原因?函数参数不能被泛化以便可以多态使用吗?