考虑 GHCi 会话中的这个示例:
Prelude> :set -XRankNTypes
Prelude> let bar :: (forall a.[a]->[a]) -> [Int]; bar f = f [1,2,3]
这定义了一个bar
rank-2 类型的函数。因此,类型推断不应该能够推断出正确的类型:
Prelude> let foo f = bar f
确实,
<interactive>:7:17:
Couldn't match type `t' with `[a] -> [a]'
`t' is a rigid type variable bound by
the inferred type of foo :: t -> [Int] at <interactive>:7:5
In the first argument of `bar', namely `f'
In the expression: bar f
In an equation for `foo': foo f = bar f
令人惊讶的是,如果我们以无点风格编写相同的内容,它会起作用:
Prelude> let baz = bar
Prelude> :t baz
baz :: (forall a. [a] -> [a]) -> [Int]
类型推断如何在这里推断出更高等级的类型?任何人都可以确认这在 GHC 中得到了特殊处理,或者指出我错在哪里。