我在Haskell中编写代码就像take一样,除了它从列表的末尾获取元素.
snatch :: (Num a, Ord a) => a -> [b] -> [b]
snatch n _
| n <= 0 = []
snatch _ [] = []
snatch n x = reverse (take n (reverse x))
Run Code Online (Sandbox Code Playgroud)
问题出在这条线上,
snatch n x = reverse (take n (reverse x))
Run Code Online (Sandbox Code Playgroud)
它基本上表明,对于取n,n必须是Int.但是,a是Num类型.如果我将函数的定义更改为this,
snatch :: Int -> [b] -> [b]
Run Code Online (Sandbox Code Playgroud)
然后它工作正常.我试过阅读文档和搜索互联网.但我找不到原因.Int显然是一类Num.那不应该这样吗?为什么不起作用?
take顾名思义,它需要n元素.按照你的逻辑,如果Num是唯一的标准,那么你的函数应该能够从列表中获取5.4343个元素.只是,这没有意义.
因此,在这种情况下,即使Int是实例Num,所需的属性也是特定的属性Int.