在Haskell中检查推断类型时的非类型变量参数

时间:2017-05-05 01:52:08

标签: haskell

我是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]

1 个答案:

答案 0 :(得分:5)

当您使用相同类型的两个不同参数调用函数时,不可能会出现类型错误而另一个将通过。所以其他事情正在发生。

特别是

myDrop -2 [1,2,3]

不会按照您的预期解释。它被解释为这样

myDrop - (2 [1,2,3])

即,从2中以列表[1,2,3]作为参数,减去被称为(作为函数)的数字myDrop。换句话说,完全是胡说八道。这就是为什么类型错误看起来很奇怪。

在Haskell中,负常量需要括号:

myDrop (-2) [1,2,3]