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

Ing*_*das 3 haskell set

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

    data Vector = V 
    { x :: Double
    , y :: Double
    } deriving (Eq)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ijn 8

Set要求您使用Ord元素类型的默认实例.

如果要使用其他Ord实例,标准方法是使用自定义newtype包装器,然后Ord为其编写实例:

newtype Y = Y { unY :: Vector } deriving Eq
instance Ord Y where compare = comparing ((y . unY) &&& (x . unY))
Run Code Online (Sandbox Code Playgroud)

但由于这种比较方式与二进制元组的比较方式相同,因此KennyTM的解决方案最简单.

  • 尼斯.我只是输入完全相同的东西. (2认同)