Haskell:简单函数的意外“不在范围内”错误

时间:2016-05-14 11:11:50

标签: haskell

这是一个非常特别的例子,描述了我所遇到的Not in scope: isOne错误:

ignoreFirstOnes :: [Int] -> [Int]
ignoreFirstOnes (1:xs) = dropWhile isOne xs
ignoreFirstOnes xs     = xs
  where isOne = (== 1)

奇怪isOne函数是在where中定义的,但是编译器一直在抱怨。我可以使用警卫甚至dropWhile (== 1)重写它,但我想了解如何使工作成为当前的例子。

1 个答案:

答案 0 :(得分:5)

where子句中定义的名称仅在where子句所附加的分支的范围内。

这个版本的定义将编译,因为我将where子句附加到使用ignoreFirstOnes的{​​{1}}分支。

isOne

虽然注意到这个定义相当于ignoreFirstOnes :: [Int] -> [Int] ignoreFirstOnes (1:xs) = dropWhile isOne xs where isOne = (== 1) ignoreFirstOnes xs = xs ,我认为这更简单。