我正在尝试将此数据类型放在Haskell集中,但我不想给它一个Ord的一般实例。所以我想在y-coördinate上给这个集合订购,但没有实例Ord Vector。这可能吗?
data Vector = V
{ x :: Double
, y :: Double
} deriving (Eq)
答案 0 :(得分:8)
Set
要求您使用元素类型的默认Ord
实例。
如果要使用其他Ord
实例,标准方法是使用自定义newtype
包装器,然后为其编写Ord
实例:
newtype Y = Y { unY :: Vector } deriving Eq
instance Ord Y where compare = comparing ((y . unY) &&& (x . unY))
但由于这种比较方式与二进制元组的比较方式相同,因此KennyTM的解决方案最简单。
答案 1 :(得分:4)
您可以将矢量转换为元组:
toTuple :: Vector -> (Double, Double)
toTuple (V x y) = (y, x)
fromTuple :: (Double, Double) -> Vector
fromTuple (y, x) = V x y
由于元组派生Ord(使用词典比较),因此可以将它们插入到Set中。 (为x-major排序定义2个其他函数。)
答案 2 :(得分:0)
我已经制作了Set
数据类型的版本,该版本没有Ord
上下文,但需要在a -> a -> Ordering
的任何地方传递Set
类型的函数是建造的。这可能对你的情况有用吗?
(我不确定版权状态,它在很大程度上未经测试,文档未被修改,所以我不只是把它放在这里......)