我有一个警卫,条件是查找x列表==某些东西,即x在列表中。我试过了:
| lookup x list == _ = my code here
但是在加载函数时,我得到“表达式上下文中的模式语法”错误?
答案 0 :(得分:1)
你会使用像
这样的守卫| any ((x ==) . fst) list = ... code ...
您收到的具体错误消息是因为_
不是有效的标识符。令牌_
仅在模式匹配中有效,模式匹配只能在明确允许它们的位置使用。模式永远不是表达式,因此它们不能用于任何需要任意表达的地方。
如果您在GHC中启用PatternGuards
扩展程序,您也可以使用以下语法执行所需操作:
| Just _ <- lookup x list = ... code ...
请注意,我在Just
结果上匹配,而不是所有结果。请注意,lookup
在找不到某些内容时仍会生成 a 值,并且_
模式与所有值匹配。
注意到模式保护语法的效果与此处的输入量相同,在这种情况下使用它的好处是它还允许您将名称绑定到查找的值,如果您愿意的话。
| Just y <- lookup x list = ... code that uses y...
在没有图案防护的情况下执行此操作需要在体内进行模式匹配,这可能有点令人不满意。
答案 1 :(得分:1)
或者,如果您发现想要将无偿模式匹配隐藏在库中......
import Data.Maybe (fromJust)
...
| isJust (lookup x list) = ...