haskell 中 'case maybeVal of' 的多个 'Just x'

Multiple 'Just x' for 'case maybeVal of' in haskell

多个 'Just' 个案例在 haskell 中按顺序工作,例如。在

findElement :: Ord a => a -> [a] -> Maybe Int
findElement element list = case (listToMaybe list) of
                             Nothing -> Nothing
                             Just element -> Just 0
                             Just _ -> Just (1 + (fromMaybe 0 (findElement element (tail list))))

Just 案例中只有一个似乎有效(无论哪个放在第一位)。 预期结果是-

> findElement 4 [1,2,3,4,5,6,7,8]
Just 3
> findElement 3 [5,6,4,7,8,0]
Nothing
> findElement 4 []
Nothing
> findElement 'o' "Hello world"
Just 4
> findElement 'x' ""
Nothing

不行,那样不行,你需要这样的守卫:

findElement element list = 
   case (listToMaybe list) of
      Nothing               -> ...
      Just e | e == element -> ...
      Just _                -> ...

问题是:模式中出现的每个变量都绑定到匹配值。如果你写 Just element 不是 引用前一个变量 element 而是引入一个 new 局部变量,必须如我上面的代码中的 e

因此,Just element 上的模式匹配与

非常相似
 findElement element list = 
    let element = ...
    in ...

在最后一行,前面的变量element被后面的绑定得到"shadowed"。

为了避免这个错误,我强烈建议使用 -Wall 打开警告:这会指出危险的阴影。