非类型变量参数错误

时间:2018-07-20 19:55:00

标签: haskell

我正在尝试在Haskell中编写自己的take函数版本,但我不明白我要去哪里。这是我的代码:

take' :: (Num i, Ord i) => i -> [a] -> [a]
take' n xs
    | n <= 0  = []
    | null xs = []
    | otherwise = first : rest 
    where first = head xs
          rest  = take' (n - 1) (tail xs)

据我了解,在函数开头指定(Num i, Ord i) => i ...意味着我应该能够传递一个负整数。但是,当我在交互式解释器中尝试take' -1 [1..10]时,会出现此错误:

*Main> take' -1 [1..10]

<interactive>:154:1: error:
    * Non type-variable argument
        in the constraint: Num (i -> [a2] -> [a2])
      (Use FlexibleContexts to permit this)
    * When checking the inferred type
        it :: forall i a1 a2.
              (Ord i, Num i, Num a1, Num (i -> [a2] -> [a2]),
               Num ([a1] -> i -> [a2] -> [a2]), Enum a1) =>
              i -> [a2] -> [a2]

我尝试在代码中启用FlexibleContexts,但并没有改变任何东西。据我了解,我需要Num i,因为我在where语句中递减了i,而我需要Ord i是因为需要一种方法来计算我要采用的元素数。我这是怎么了?

1 个答案:

答案 0 :(得分:7)

take' -1被解释为从take'中减去1,这是一个错误,因为您不能从函数中减去某些东西。您需要使用take' (-1)

请注意,这并不特定于您对take'的定义。常规take也会发生同样的事情。