如何指定我希望Haskell中出现的内容

如何指定我希望Haskell中出现的内容,haskell,lookup,pattern-guards,Haskell,Lookup,Pattern Guards,我有一个保护,条件是查找x list==某个东西,即x在列表中。我试过: | lookup x list == _ = my code here 但是当加载函数时,我得到一个“表达式上下文中的模式语法”错误?您应该使用类似于 | any ((x ==) . fst) list = ... code ... 您收到的特定错误消息是因为不是有效的标识符。令牌\uuu仅在模式匹配中有效,模式匹配只能在明确允许它们的位置使用。模式从来都不是表达式,因此它们不能用于任何需要任意表达式的地方 如果在GH

我有一个保护,条件是查找x list==某个东西,即x在列表中。我试过:

| lookup x list == _ = my code here
但是当加载函数时,我得到一个“表达式上下文中的模式语法”错误?

您应该使用类似于

| any ((x ==) . fst) list = ... code ...
您收到的特定错误消息是因为
不是有效的标识符。令牌
\uuu
仅在模式匹配中有效,模式匹配只能在明确允许它们的位置使用。模式从来都不是表达式,因此它们不能用于任何需要任意表达式的地方

如果在GHC中启用
PatternGuards
扩展,还可以使用以下语法:

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

如果不使用模式防护装置,则需要在体内进行模式匹配,这可能有点令人不满意。

或者如果您发现要将免费的模式匹配隐藏在库中

import Data.Maybe (fromJust)

...
    | isJust (lookup x list) = ...

在防护装置中进行模式匹配并不违法(只需在其中粘贴一个
的框即可)。但是,比较运算符
(==)
需要两个布尔值,而不是布尔值和模式。@kqr-Hmm,我的措辞有点糟糕。修理。哎呀,我才意识到我的答案是错的。现在修好了。不,我不喜欢。符号是什么:| any((x==).fst)list=。。。代码。。。没有这个@Haskell中的
操作符James是您应该了解的内容。这是一个单字符中缀运算符的原因-它功能强大且有用。它允许您以最小的语法开销将两个函数组合成一个新函数,这对于将小型单用途函数组合到所需逻辑中的语言来说是一个重要的构建块。
import Data.Maybe (fromJust)

...
    | isJust (lookup x list) = ...