我有一个保护,条件是查找x列表==某个东西,即x在列表中。我试过了:
| lookup x list == _ = my code here
但是当加载函数时,我得到了一个"表达式上下文中的模式语法"错误?
你应该使用类似的防护
| any ((x ==) . fst) list = ... code ...
您收到的特定错误消息是因为_
不是有效的标识符。令牌_
仅在模式匹配中有效,并且模式匹配只能在明确允许的地方使用。模式从来都不是一个表达式,所以它们不能在任何需要任意表达式的地方使用。
如果您在GHC中启用PatternGuards
扩展,您也可以使用以下语法执行您想要的操作:
| Just _ <- lookup x list = ... code ...
请注意,我匹配的是Just
结果,而不是所有结果。请记住,当lookup
找不到东西时,它仍然会产生一个值,并且_
模式匹配所有值。
注意到模式保护语法在这里的输入量是相同的,在这种情况下使用它的好处是,如果您愿意,它还可以将名称绑定到所查找的值。
| Just y <- lookup x list = ... code that uses y...
在没有图案保护的情况下这样做需要在身体内部进行图案匹配,这可能有点不令人满意。
或者,如果您发现要将免费模式匹配隐藏在库中。。。
import Data.Maybe (fromJust)
...
| isJust (lookup x list) = ...