2016-09-11 14 views
1

私はXというコンテナ型を持っています。 X以上の異種リストが必要なので、そのコンストラクタはあるタイプの変数aに存在する型に存在します。しかし、私はそれがEqタイプのクラスのインスタンスであることを望みます。ハックなソリューションは次のようになります。GADT、未定義の型とインスタンスのイコール

{-# LANGUAGE GADTs #-} 

data X where X :: (Eq a, Show a) => a -> X 

instance Eq X where 
    X x == X y = show x == show y 

この問題の最も単純な(クリーンな)解決策は何ですか?

(。彼らは同じ型を持っていない場合X sが等しくない)

答えて

7

あなたがタイプのランタイム表現を持つようにTypeableを追加します。 castを使用して、それらの1つを適切なタイプにキャストします。

{-# LANGUAGE GADTs #-} 
import Data.Typeable 

data X where X :: (Eq a, Typeable a) => a -> X 

instance Eq X where 
    X x == X y = Just x == cast y 
関連する問題