为什么我们在复制函数中将输入限制为Ord?

时间:2018-07-16 21:01:07

标签: haskell

这是重写重复功能的示例:

replicate' :: (Num i, Ord i) => i -> a -> [a]  
replicate' n x  
    | n <= 0    = []  
    | otherwise = x:replicate' (n-1) x

我们只需要知道多少次我们将重复输入。为什么我们限制重复数为Ord?我们不在乎订购,不是吗?

1 个答案:

答案 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(<=)就足够了,因为所有其他功能都可以通过实现这两个功能之一来派生(实际上是实现(<)(<=)中的一个功能,(>)(>=)在理论上就足够了,但是在这里他们选择了(<=)作为实现的来源。