Haskell将Num传递给Int

Jas*_*son 1 haskell

我在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.那不应该这样吗?为什么不起作用?

shr*_*t18 6

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

因此,在这种情况下,即使Int是实例Num,所需的属性也是特定的属性Int.