私は幻の種類があります。その後、a1 < a2
MyType a1
< MyType a2
場合ファントムタイプの引数に対してファントムタイプのインスタンスを比較するにはどうすればよいですか?
newtype MyType a = {getSth :: SthType}
はどのようにして、すなわち、a1
とa2
比較の結果に関してMyType a1
とMyType a2
を比較することができますか?
私は幻の種類があります。その後、a1 < a2
MyType a1
< MyType a2
場合ファントムタイプの引数に対してファントムタイプのインスタンスを比較するにはどうすればよいですか?
newtype MyType a = {getSth :: SthType}
はどのようにして、すなわち、a1
とa2
比較の結果に関してMyType a1
とMyType a2
を比較することができますか?
標準の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
Shang、ありがとう! – user2466068
実際、これは元の質問には答えません。初期の目標は 'x :: MyType a'と' y :: MyType b'とを 'a'と' b'型で最初に比較し、次に 'getInt x'と' getInt y'だけを比較することです。異なるタイプのオブジェクトの値で比較を実装しただけです。しかし、あなたはタイプに関して辞書編集的ではありません。 – Shersh
あなたの 'newtype'は構文的に正しいものではありません。つまり、 'a1 a - > a - >ブール。あなたは実際に何をしたいですか? –
Zeta