如何比较幻像类型的实例与幻像类型参数?

时间:2016-10-05 06:47:32

标签: haskell phantom-types

我有幻影类型:

newtype MyType a = {getSth :: SthType} 

如何比较MyType a1MyType a2a1a2比较的结果,即a1 < a2然后MyType a1 &LT; MyType a2

1 个答案:

答案 0 :(得分:2)

由于使用标准EqOrd类型类的比较要求所比较的两个值具有完全相同的类型(包括幻像类型参数),您需要定义自己的比较运算符或使用存在的包装器。例如:

{-# 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