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

fra*_*nza 3 haskell

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

ignoreFirstOnes :: [Int] -> [Int]
ignoreFirstOnes (1:xs) = dropWhile isOne xs
ignoreFirstOnes xs     = xs
  where isOne = (== 1)
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*son 5

where子句中定义的名称仅在where子句附加到的分支上的范围内.

这个版本的定义将编译,因为我将该where子句附加到该ignoreFirstOnes用法的分支isOne.

ignoreFirstOnes :: [Int] -> [Int]
ignoreFirstOnes (1:xs) = dropWhile isOne xs
    where isOne = (== 1)
ignoreFirstOnes xs = xs
Run Code Online (Sandbox Code Playgroud)

虽然注意到这个定义相当于ignoreFirstOnes = dropWhile (==1)我认为更简单的定义.