このヒントは、Show
のインスタンスの値のリストを作成することです。 GADTを使用して具体的なShowable
タイプを作成する次のスニペットが見つかりました。GADTを使用したタイプクリスタルの具体的なタイプを構築する
data Showable where Showable :: Show a => a -> Showable
instance Show Showable where
show (Showable x) = show x
list :: [Showable]
list = [Showable 4, Showable "hello", Showable 'a']
その後、私は、任意の型クラスコンクリートを作ることができるタイプを作成することによりShowable
は、より一般的な作ってみました。
data Concrete a where Concrete :: a b => b -> Concrete a
instance Show (Concrete Show) where
show (Concrete x) = show x
list :: [Concrete Show]
list = [Concrete 4, Concrete "hello", Concrete 'a']
これはConstraintKindsとFlexibleInstances言語拡張機能で動作しますが、他の型クラスの具体的な種類を作るためにConcrete
を使用するために、それぞれが新しいインスタンスを必要とします。
Concrete Show
が自動的にShow
のインスタンスになるようなConcrete
のようなものを作成する方法はありますか?
「コンクリート」は*タイプのコンストラクタ*であり、「ショー」は*タイプのクラス*であるため、「コンクリートショー」という表現は法律ではなく、私は間違っているかもしれないが、私はあなたがこれを働かせないことを提案するつもりだ。 – MathematicalOrchid
@MathematicalOrchidすでに、ConstraintKindsとFlexibleInstancesで動作しました。私はこれを質問に加えました。 – afuous
@MathematicalOrchid今度は、kindingシステムが 'Show :: * - > Constraint'を許可するので、上で行ったように、そのような種類の型をパラメータ化できます。興味深いもの: – chi