我是Haskell的新手。我自己实现了drop
。
myDrop n xs = if n <= 0 || null xs
then xs
else myDrop (n - 1) (tail xs)
但我在n < 0
时调用它,例如myDrop -2 [1, 2, 3]
。它会引发错误:
<interactive>:23:1: error:
• Non type-variable argument
in the constraint: Num ([t] -> t1 -> [a] -> [a])
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall t a t1.
(Num ([t] -> t1 -> [a] -> [a]), Num (t1 -> [a] -> [a]), Num t,
Num t1, Ord t1) =>
t1 -> [a] -> [a]
答案 0 :(得分:5)
当您使用相同类型的两个不同参数调用函数时,不可能会出现类型错误而另一个将通过。所以其他事情正在发生。
特别是
myDrop -2 [1,2,3]
不会按照您的预期解释。它被解释为这样
myDrop - (2 [1,2,3])
即,从2
中以列表[1,2,3]
作为参数,减去被称为(作为函数)的数字myDrop
。换句话说,完全是胡说八道。这就是为什么类型错误看起来很奇怪。
在Haskell中,负常量需要括号:
myDrop (-2) [1,2,3]