我有幻影类型:
newtype MyType a = {getSth :: SthType}
如何比较MyType a1
和MyType a2
与a1
和a2
比较的结果,即a1 < a2
然后MyType a1
&LT; MyType a2
?
答案 0 :(得分: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