Haskell GHC中处理更高级别类型的特殊情况?

Haskell GHC中处理更高级别类型的特殊情况?,haskell,functional-programming,type-inference,pointfree,higher-rank-types,Haskell,Functional Programming,Type Inference,Pointfree,Higher Rank Types,考虑GHCi会议中的示例: Prelude> :set -XRankNTypes Prelude> let bar :: (forall a.[a]->[a]) -> [Int]; bar f = f [1,2,3] 这定义了一个rank-2类型的函数bar。因此,类型推断不应能够推断以下各项的正确类型: Prelude> let foo f = bar f 事实上 <interactive>:7:17: Couldn't match type `t

考虑GHCi会议中的示例:

Prelude> :set -XRankNTypes
Prelude> let bar :: (forall a.[a]->[a]) -> [Int]; bar f = f [1,2,3]
这定义了一个rank-2类型的函数
bar
。因此,类型推断不应能够推断以下各项的正确类型:

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
类型推断如何在这里推断出更高等级的类型?
有谁能证实这在GHC中是专门处理的,或者指出我的错误所在。

在存在高秩类型的情况下,类型推断的主要问题是推断lambda绑定变量的多态类型。在第一个示例中,键入
foo
的唯一正确方法是将多态类型分配给
f
。在第二个例子中,不需要这样的东西。相反,
baz
只是
bar
的一个(微不足道的)部分应用。仅仅应用一个更高级别的多态函数,而没有任何lambda抽象,在没有额外类型注释的情况下,应该总是可能的


另请参见中的相应部分以及各种研究论文。

事实上,类型检查器似乎很高兴,只要它不必推断在高阶参数处传递的lambda绑定变量的类型。
Prelude> let baz = bar
Prelude> :t baz
baz :: (forall a. [a] -> [a]) -> [Int]