2016-06-29 15 views
2

このヒントは、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のようなものを作成する方法はありますか?

+0

「コンクリート」は*タイプのコンストラクタ*であり、「ショー」は*タイプのクラス*であるため、「コンクリートショー」という表現は法律ではなく、私は間違っているかもしれないが、私はあなたがこれを働かせないことを提案するつもりだ。 – MathematicalOrchid

+0

@MathematicalOrchidすでに、ConstraintKindsとFlexibleInstancesで動作しました。私はこれを質問に加えました。 – afuous

+1

@MathematicalOrchid今度は、kindingシステムが 'Show :: * - > Constraint'を許可するので、上で行ったように、そのような種類の型をパラメータ化できます。興味深いもの: – chi

答えて

6

これはできません。

instance Monoid (Concrete Monoid) where 
    mappend (Concrete x) (Concrete y) = Concrete (mappend x y) -- type error! 

xyは、2つの異なる実存定量化から来るので、これは型エラーです:この考えてみましょう。 xyを一緒に追加できる保証はありません。

つまり、[Concrete [1,2], Concrete ["hello"]]はタイプ[Concrete Monoid]ですが、合計することはできません(mconcat)。


これはOOPで、正確で同じ問題であり、次の基本クラス/インタフェースが動作しない:

interface Vector { 
    Vector scale(double x); 
    Vector add(Vector v); 
} 
class Vec2D implements Vector { ... } 
class Vec3D implements Vector { ... } 

インターフェースは、2Dベクトルは、他のベクトルに追加可能であることを意味し、それは意味をなさない3Dものを含む。 OOPソリューションについては、F-bounded quantificationとそれに関連する大衆化curiously recurring template patternを参照してください。

ハスケルでは、サブタイプがないため、この種の技術は必要ないことが多いため、Vectorタイプの2つのタイプはすでに混在できません。

class Vector a where 
    scale :: Double -> a -> a 
    add :: a -> a -> a 
instance Vector (Vec2D) where ... 
instance Vector (Vec3D) where ... 
+3

だからこそ、これはJavaでは「Thing implements Comparable」だけでなく、「Thing implements Comparable 」です。これは良い答えです。 – afuous

+0

@afuousはい、そうです。 – chi

関連する問題