我正在阅读LYAH中的一些示例,我遇到了这段代码:
replicate' :: (Num i, Ord i) => i -> a -> [a]
replicate' n x
| n <= 0 = []
| otherwise = x:replicate' (n-1) x
这是来自在线版本,但我也有一本书的副本,而不是:
replicate' :: Int -> a -> [a]
replicate' n x
| n <= 0 = []
| otherwise = x:replicate' (n-1) x
我已尝试过这两种方法但它们都有效但我的问题是:
这些实现是否有所不同,何时应该使用类型类而不是常规类型?
答案 0 :(得分:2)
第二个版本仅适用于Int
作为第一个参数。第一个版本更通用,适用于Num
和Ord
类型类中的任何类型。 Num
类型类定义了与数值类型一起使用的基本操作。在这种情况下,replicate'
需要能够从参数n
中减去1。 Ord
定义了比较操作。由于您使用<=
,因此需要这样做。请注意Int
同时存在于这两个类型中,因此它支持两种必需的操作。通过使用更多更通用的类型签名声明该函数,replicate'
可以与支持所需操作的任何其他类型一起使用。