如何在Haskell中实现代数数据类型的"Ord"?

Len*_*low 7 haskell

想象一下,你有一个评级

Rating = OneStar | TwoStars | ThreeStars | FourStars | FiveStars
Run Code Online (Sandbox Code Playgroud)

在Haskell中为这样的代数数据类型实例化/实现"Ord"的最佳方法是什么?

sep*_*p2k 15

最好的方法是添加deriving (Eq, Ord)到类型的定义.

由于您按升序列出了构造函数,因此派生Ord实例将为您提供所需的顺序.

但是,如果由于某种原因更改定义中的顺序不是一个选项,您仍然可以导出Eq,因为顺序无关紧要.给定Eq的实例,我们可以手动为Ord编写实例.定义比较最简洁的方法可能是拼出比较应返回LT的所有组合,然后简单地使用比较xy | x == y = Eq; 比较_ _ = GT表示其余组合.

  • @Lenny:然后你要实例化Ord并手动定义`compare`(假设由于某些原因改变定义中的顺序不是一个选项) - 你仍然可以派生Eq,因为顺序无关紧要.定义`compare`的最简洁方法可能是拼出所有比较应返回LT的组合,然后简单地使用`compare xy | x == y = Eq; 比较_ _ = GT`为剩余的组合. (2认同)
  • @Lenny更简单的解决方案:更改定义,使其按升序排列! (2认同)