预定义的类型类和基本类型之间的使用差异

时间:2016-01-20 21:33:36

标签: haskell types typeclass

我正在阅读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  

我已尝试过这两种方法但它们都有效但我的问题是:

这些实现是否有所不同,何时应该使用类型类而不是常规类型?

1 个答案:

答案 0 :(得分:2)

第二个版本仅适用于Int作为第一个参数。第一个版本更通用,适用于NumOrd类型类中的任何类型。 Num类型类定义了与数值类型一起使用的基本操作。在这种情况下,replicate'需要能够从参数n中减去1。 Ord定义了比较操作。由于您使用<=,因此需要这样做。请注意Int同时存在于这两个类型中,因此它支持两种必需的操作。通过使用更多更通用的类型签名声明该函数,replicate'可以与支持所需操作的任何其他类型一起使用。