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,如果n在Ord和中Num,List n则Ord比较的工作方式如下.语法非常类似于数学,=>其含义是什么.希望这会使记忆更容易.
你必须给出一个合理的定义compare.作为参考,compare a b如下工作:如果a < b它返回LT,a = b它是否返回EQ以及a > b它是否返回GT.
这是一个很容易实现的功能,因此我将把它作为练习留给读者.(我一直想说:P).