具有给定排序的无序数据类型的集合

时间:2010-03-25 08:29:45

标签: haskell set

我正在尝试将此数据类型放在Haskell集中,但我不想给它一个Ord的一般实例。所以我想在y-coördinate上给这个集合订购,但没有实例Ord Vector。这可能吗?

    data Vector = V 
    { x :: Double
    , y :: Double
    } deriving (Eq)

3 个答案:

答案 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类型的函数是建造的。这可能对你的情况有用吗?

(我不确定版权状态,它在很大程度上未经测试,文档未被修改,所以我不只是把它放在这里......)