这是重写重复功能的示例:
replicate' :: (Num i, Ord i) => i -> a -> [a]
replicate' n x
| n <= 0 = []
| otherwise = x:replicate' (n-1) x
我们只需要知道多少次我们将重复输入。为什么我们限制重复数为Ord?我们不在乎订购,不是吗?
答案 0 :(得分:2)
如果我们看一下代码,就会看到:
replicate' :: (Num i, Ord i) => i -> a -> [a]
replicate' n x
| n <= 0 = []
| otherwise = x:replicate' (n-1) x
因此,我们检查n
是否小于或等于0
。因此,我们需要n
的顺序关系,因为它定义了何时i
类型的两个元素以这种方式排序,即前者小于或等于后者。
此功能是Ord
typeclass提供的功能:
class Eq a => Ord a where compare :: a -> a -> Ordering (<) :: a -> a -> Bool (<=) :: a -> a -> Bool (>) :: a -> a -> Bool (>=) :: a -> a -> Bool max :: a -> a -> a min :: a -> a -> a
实施compare
或(<=)
就足够了,因为所有其他功能都可以通过实现这两个功能之一来派生(实际上是实现(<)
,(<=)
中的一个功能,(>)
和(>=)
在理论上就足够了,但是在这里他们选择了(<=)
作为实现的来源。