gpt4 book ai didi

haskell - 为什么非详尽的守卫会导致无可辩驳的模式匹配失败?

转载 作者:行者123 更新时间:2023-12-04 01:49:59 26 4
gpt4 key购买 nike

我在 Haskell 中有这个功能:

test :: (Eq a) => a -> a -> Maybe a
test a b
| a == b = Just a
test _ _ = Nothing

这是我尝试使用不同输入的函数时得到的结果:
ghci>test 3 4
Nothing
ghci>test 3 3
Just 3

根据 Real World Haskell 的说法,第一种模式是无可辩驳的。但似乎 test 3 4不会失败第一个模式,并匹配第二个。我预计会出现某种错误——也许是“非详尽的守卫”。那么这里到底发生了什么,有没有办法在这种意外发生的情况下启用编译器警告?

最佳答案

第一个模式确实是一个“无可辩驳的模式”,但这并不意味着它总是会选择你函数的相应右侧。它仍然受制于可能会失败的 guard ,就像在您的示例中那样。

为确保涵盖所有情况,通常使用 otherwise拥有一个永远成功的最后 guard 。

test :: (Eq a) => a -> a -> Maybe a
test a b
| a == b = Just a
| otherwise = Nothing

请注意, otherwise 并没有什么神奇之处。 .它在 Prelude 中被定义为 otherwise = True .但是,使用 otherwise 是惯用的。对于最后一个案例。

在一般情况下,让编译器警告非详尽的防护是不可能的,因为它涉及解决停止问题,但是存在像 Catch 这样的工具它试图比编译器更好地确定在常见情况下是否涵盖所有情况。

关于haskell - 为什么非详尽的守卫会导致无可辩驳的模式匹配失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7109282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com