为列表创建新的Ord实例

cdk*_*cdk 5 haskell typeclass instances

这是我第一次尝试创建类的自定义实例,如Ord.

我已经定义了一个新的数据结构来表示一个列表:

data List a = Empty | Cons a (List a)
    deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

现在我想为List定义一个新的Ord实例,使得List a <= List b意味着"List a中元素的总和小于或等于List b中元素的总和"

首先,是否有必要定义一个新的"sum"函数,因为Prelude中定义的总和不适用于新的List数据类型?那么,我如何为列表定义Ord的新实例?

谢谢

Tik*_*vis 12

首先,这与普通列表实例完全不同.普通实例仅取决于可自行订购的列表项目; 你的建议取决于他们的数字(例如在Num课堂上),因此更加狭窄.

有必要定义一个新sum函数.令人高兴的是,它很容易编写sum为一个简单的递归函数.(巧合的是,你可以调用你的函数sum',它的发音为"sum prime",按惯例意味着它的函数非常相似sum.)

此外,实例必须依赖于Num类和Ord类.

一旦有了新sum功能,就可以定义一个这样的实例:

instance (Ord n, Num n) => Ord (List n) where compare = ... 
  -- The definition uses sum'
Run Code Online (Sandbox Code Playgroud)

这个实例语句可以理解为对于所有类型n,如果nOrd和中Num,List nOrd比较的工作方式如下.语法非常类似于数学,=>其含义是什么.希望这会使记忆更容易.

你必须给出一个合理的定义compare.作为参考,compare a b如下工作:如果a < b它返回LT,a = b它是否返回EQ以及a > b它是否返回GT.

这是一个很容易实现的功能,因此我将把它作为练习留给读者.(我一直想说:P).

  • 非常好的答案,如果可以的话,我会投票...一旦你在你面前得到答案,Haskell非常直观 (2认同)