我在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。所以不应该这样做吗?为什么它不起作用?
答案 0 :(得分:6)
take
,顾名思义,需要n
元素。按照你的逻辑,如果Num
是唯一的标准,那么你的函数应该能够从列表中获取5.4343个元素。只是,这没有意义。
因此,在这种情况下,即使Int
是Num
的实例,所需的属性也是Int
特有的属性。