Haskell将Num传递给Int

时间:2014-04-21 06:30:57

标签: haskell

我在Haskell中编写的代码就像take一样,除了它从列表的末尾获取元素。

snatch :: (Num a, Ord a) => a -> [b] -> [b]
snatch n _
     | n <= 0 = []
snatch _ [] = []
snatch n x = reverse (take n (reverse x))

问题出在这一行,

snatch n x = reverse (take n (reverse x))

它基本上表明,对于take n,n必须是Int。但是,a是Num类型。如果我将函数的定义更改为此,

snatch :: Int -> [b] -> [b]

然后它工作正常。我试过阅读文档和搜索互联网。但我无法找到原因。 Int显然是一类Num。所以不应该这样做吗?为什么它不起作用?

1 个答案:

答案 0 :(得分:6)

take,顾名思义,需要n元素。按照你的逻辑,如果Num是唯一的标准,那么你的函数应该能够从列表中获取5.4343个元素。只是,这没有意义。

因此,在这种情况下,即使IntNum的实例,所需的属性也是Int特有的属性。