4

forallデータ定義でパラメトリック型を持つように明示的に言う必要があるようです。たとえば、これ

data A = A (forall s. ST s (STUArray s Int Int))

この間に動作します

data A = A (ST s (STUArray s Int Int))

しません。

あまりにも明白なことを尋ねているのかもしれませんが、他のほとんどの場合forall、パラメトリック型を明示的に指定する必要がないため、その理由は私には明らかではありません。コンパイラが代わりにそれを行います。では、ここでの違いは何ですか?

4

1 に答える 1

7

移動できる場所は 2 つありますがforall、意図した場所は 1 つだけです。もう一つは

data A = forall s . A (ST s (STUArray s Int Int))

これはGADT構文と同等です

data A where
  A :: ST s (STUArray s Int Int) -> A

STこれは、何らかの状態変換器を保持するボックスと考えることができますが、sまったく役に立ちません。ただし、型チェッカーは のニーズに合わせて特別に調整されているわけではなくST、同様の型は他のコンテキストでも役立ちます。

于 2015-09-15T16:20:12.090 に答える