这是一个非常特别的例子,描述了我所遇到的Not in scope: isOne
错误:
ignoreFirstOnes :: [Int] -> [Int]
ignoreFirstOnes (1:xs) = dropWhile isOne xs
ignoreFirstOnes xs = xs
where isOne = (== 1)
奇怪isOne
函数是在where
中定义的,但是编译器一直在抱怨。我可以使用警卫甚至dropWhile (== 1)
重写它,但我想了解如何使工作成为当前的例子。
答案 0 :(得分:5)
where
子句中定义的名称仅在where
子句所附加的分支的范围内。
这个版本的定义将编译,因为我将where
子句附加到使用ignoreFirstOnes
的{{1}}分支。
isOne
虽然注意到这个定义相当于ignoreFirstOnes :: [Int] -> [Int]
ignoreFirstOnes (1:xs) = dropWhile isOne xs
where isOne = (== 1)
ignoreFirstOnes xs = xs
,我认为这更简单。