如何指定我希望Haskell中存在某些内容

时间:2013-11-22 16:15:31

标签: haskell lookup pattern-guards

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

| lookup x list == _ = my code here

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

2 个答案:

答案 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) = ...