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
打开警告:这会指出危险的阴影。
多个 '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
打开警告:这会指出危险的阴影。