GHCのScopedTypeVariables
は、機能パターンではタイプ変数をバインドできますが、パターンではできません。Haskellのスコープ付きタイプ変数は、パターンバインディングでタイプ変数のバインドを許可しないのはなぜですか?
最小限の例として、私はFooの内部型へのアクセスを得るためにしたい場合は、タイプ
data Foo where Foo :: Typeable a => a -> Foo
を検討し、以下の機能がコンパイルされません:
fooType :: Foo -> TypeRep
fooType (Foo x) =
let (_ :: a) = x
in typeRep (Proxy::Proxy a)
しかし、このトリックを使用して型変数バインディングを関数呼び出しに移動するには、問題なく動作します。
fooType (Foo x) =
let helper (_ :: a) = typeRep (Proxy::Proxy a)
in helper x
let
バインディングは実際には偽装の関数バインディングなので、なぜ上記の2つのコードスニペットは同等ではありませんか?
(この例では、他のソリューションはtypeOf x
でTypeRep
を作成することです、またはトップレベルの機能にx :: a
として直接変数をバインドします。これらのオプションのどちらもが、私の実際のコードで利用できる、とdoesnのそれらを使用して」質問に答えてください)
を明示的にすべての任意の型の変数を導入する必要はありません: 'fooType(フー・X)= TYPEREP [X] 'typeRep'の' proxy'が任意のファンクタになりうるという事実を利用して動作します:必ずしも些細な 'Proxy'ではなく、実際に' a'値を含むものでもあります! – leftaroundabout
@leftaround私たちが型変数を取り除くなら、さらに進んで 'fooType(Foo x)= typeOf x'と言うことができます。私は先に進み、実際のユースケースは、型変数にアクセスすることが重要な部分であると仮定しました。 – Carl
@Carlええ、実際の 'x'値を含む具象コンテナでも' proxy x'引数を持つ_any_関数を呼び出すことは一般的には知られていません。 – leftaroundabout