正確な型パラメータが隠されているパラメータ化型を生成するHaskell関数を記述できますか?私。 f :: T -> (exists a. U a)
のようなもの?明白な試み:私は気にしないことGHCを説得する方法があるならば、私は、これは不自然な例ですけど、私は好奇心が強いHaskell関数が存在型を返す
Couldn't match type `a1' with `a'
`a1' is a rigid type variable bound by
a pattern with constructor
Wrap :: forall a. D a -> Wrap,
in an equation for `unwrap'
at test.hs:8:9
`a' is a rigid type variable bound by
the type signature for unwrap :: Wrap -> D a at test.hs:7:11
Expected type: D a
Actual type: D a1
In the expression: d
In an equation for `unwrap': unwrap (Wrap d) = d
:
{-# LANGUAGE ExistentialQuantification #-}
data D a = D a
data Wrap = forall a. Wrap (D a)
unwrap :: Wrap -> D a
unwrap (Wrap d) = d
を使用してコンパイルに失敗しますD
がパラメータ化された正確な型。unwrap
の結果の別の実体ラッパー型を導入しません。明確にするために
、私は型の安全性をしたいですが、またunwrap
の結果約a
を(例えばそれだけでD
からStringフィールドを抽出しているため)気にしない機能dToString :: D a -> String
を適用できるようにしたいと思います。私はそれを達成する他の方法があることを理解しています(例えば、wrapToString (Wrap d) = dToString d
を定義しています)。なぜなら、そのような隠蔽が実在しない根本的な理由があるかどうかに、より興味があります。
私は理由が存在すると思います。 D a'はHaskellの一部ではありません。冗長性を避けるための単純な要望です。この型は 'forall rと同じです。 (for a a D a - > r) - > r'であるので、実在の値を表現するのにも同様に使うことができます。 –
@ n.m。厳密に言えばそれは同等ではないが、私はそのような存在価値に行える唯一の有用なことは、関数forall aの適用であることに同意する。 D a - > r'なので、このアドホックな存在感を表現できないのは感謝します。 –