我正在尝试在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
是因为需要一种方法来计算我要采用的元素数。我这是怎么了?
答案 0 :(得分:7)
take' -1
被解释为从take'
中减去1,这是一个错误,因为您不能从函数中减去某些东西。您需要使用take' (-1)
。
请注意,这并不特定于您对take'
的定义。常规take
也会发生同样的事情。