1

我有一个警卫,条件是查找 x 列表 == 某些东西,即 x 在列表中。我试过了:

| lookup x list == _ = my code here

但是在加载函数时出现“表达式上下文中的模式语法”错误?

4

2 回答 2

1

你会使用像

| any ((x ==) . fst) list = ... code ...

您收到的具体错误消息是因为_不是有效的标识符。令牌_仅在模式匹配中有效,而模式匹配只能在明确允许它们的地方使用。模式永远不是表达式,因此它们不能用于任何需要任意表达式的地方。

如果您PatternGuards在 GHC 中启用扩展,您还可以使用以下语法执行您想要的操作:

| Just _ <- lookup x list = ... code ...

请注意,我匹配的是Just结果,而不是所有结果。请记住,当它没有找到某些东西时,它lookup仍然会产生一个_值,并且该模式匹配所有值。

请注意,模式保护语法在这里的输入量是相同的,在这种情况下使用它的好处是它还允许您将名称绑定到查找的值,如果您愿意的话。

| Just y <- lookup x list = ... code that uses y...

在没有模式保护的情况下执行此操作将需要在主体内部进行模式匹配,这可能会有点令人不满意。

于 2013-11-22T16:19:29.030 回答
1

或者,如果您发现您想将无偿的模式匹配隐藏在库中......

import Data.Maybe (fromJust)

...
    | isJust (lookup x list) = ...
于 2013-11-22T17:35:53.100 回答