2016-10-05 11 views
-2

私は幻の種類があります。その後、a1 < a2MyType a1 < MyType a2場合ファントムタイプの引数に対してファントムタイプのインスタンスを比較するにはどうすればよいですか?

newtype MyType a = {getSth :: SthType} 

はどのようにして、すなわち、a1a2比較の結果に関してMyType a1MyType a2を比較することができますか?

+0

あなたの 'newtype'は構文的に正しいものではありません。つまり、 'a1 a - > a - >ブール。あなたは実際に何をしたいですか? – Zeta

答えて

2

標準のEqおよびOrdタイプクラスを使用した比較では、比較される両方の値が同じタイプ(ファントムタイプのパラメータを含む)である必要があるため、独自の比較演算子を定義するか、たとえば:

{-# LANGUAGE ExistentialQuantification #-} 

newtype MyType a = MyType { getInt :: Int } 

data SomeType = forall a . SomeType (MyType a) 

instance Eq SomeType where 
    (SomeType (MyType a)) == (SomeType (MyType b)) = a == b 

instance Ord SomeType where 
    compare (SomeType (MyType a)) (SomeType (MyType b)) = compare a b 

test = SomeType a < SomeType b where 
    a :: MyType Char 
    a = MyType 10 

    b :: MyType Float 
    b = MyType 15 

別のオプションを使用すると、任意の定型インスタンスを記述することなく、標準的な比較関数を使用することを可能にするData.Coerceを使用することです。

import Data.Coerce 

test2 :: Bool 
test2 = coerce ((<) :: Int -> Int -> Bool) a b where 
    a :: MyType Char 
    a = MyType 10 

    b :: MyType Float 
    b = MyType 15 
+0

Shang、ありがとう! – user2466068

+0

実際、これは元の質問には答えません。初期の目標は 'x :: MyType a'と' y :: MyType b'とを 'a'と' b'型で最初に比較し、次に 'getInt x'と' getInt y'だけを比較することです。異なるタイプのオブジェクトの値で比較を実装しただけです。しかし、あなたはタイプに関して辞書編集的ではありません。 – Shersh

関連する問題