GHCのlexically scoped type variablesを使用する場合は、explicit universal quantificationも使用する必要があります。それはあなたが、関数の型シグネチャにforall
宣言を追加する必要があり、次のとおりです。スコープタイプの変数には明示的なforallsが必要です。どうして?
{-# LANGUAGE ExplicitForAll, ScopedTypeVariables #-}
f :: forall a . [a] -> [a] -- The `forall` is required here ...
f (x:xs) = xs ++ [x :: a] -- ... to relate this `a` to the ones above.
これは実際に定量化を行うには何も持ってない、または拡張ライターはちょうどのための便利なマーカーとしてforall
キーワードをcooptんでした新しい、より広いスコープが適用されますか?
つまり、いつものようにforall
を除外することはできませんか?関数本体内のアノテーションの型変数は、関数シグネチャ内の同じ名前の変数を参照していることは明確ではないでしょうか?または、タイピングが何らかの形で問題になるかあいまいになるか?
私は自分の答えを以下に提出しましたが、私が考慮していない微妙な要素があるかどうかは疑問です。 ... – pash
Haskell-98はスコープを持っていないので、forallによって導入されたスコープ付き変数のみを持つことは妥協です。そうすることで、ScopedTypeVariablesを有効にするときに古いコードが動作するようになります。 (間違いなく、Haskellは常にスコープ付きの型変数を持っていなければなりません) – augustss