4

GHCi セッションからの次の例を考えてみましょう:

Prelude> :set -XRankNTypes
Prelude> let bar :: (forall a.[a]->[a]) -> [Int]; bar f = f [1,2,3]

これは、barランク 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で特別に扱われていることを確認したり、私が間違っている場所を指摘したりできますか.

4

1 に答える 1

4

上位の型が存在する場合の型推論の主な問題は、ラムダ バインド変数の多相型を推論することです。最初の例では、タイプする唯一の正しい方法fooは、ポリモーフィック タイプを に割り当てることfです。2 番目の例では、そのようなことは必要ありません。代わりに、bazの (自明な) 部分適用にすぎませんbar。ラムダ抽象化なしで、より高ランクの多相関数を適用するだけで、追加の型注釈なしで常に可能になるはずです。

GHC User's Guideの適切なセクションと、さまざまな研究論文も参照してください。

于 2013-07-24T19:24:58.730 に答える