Haskell - 在防护的右侧使用通配符

时间:2010-09-27 04:03:06

标签: haskell pattern-matching guard

假设我有一段这样的代码:

test pattern
 | pattern == (_,NOT (WIRE _)) = 1     
 | pattern == (_,AND (WIRE _) (WIRE _)) = 2
 | otherwise = 0

我试图将其与几种可能性中的一种相匹配,其中一些与一种(WIRE“”),一些与两种。我有如下实际输入,例如:(“p”,NOT(WIRE“x”))。我希望有一个模式可以接受任何字母作为输入(我希望与_一起)并且我失败了(非法_)。是否可以在haskell中执行此操作?

2 个答案:

答案 0 :(得分:7)

好的,这在编辑后更有意义。

==比较,但_模式。模式仅出现在以下语法上下文中:

  • 位于(模式)绑定的左侧,即“=之前的内容”,顶层或where块或let表达式或命令(位于{ {1}}符号);
  • do符号或列表理解中的<-左侧;
  • 位于do表达式中的->左侧;
  • 作为函数的形式参数,在函数绑定或lambda(case)表达式中。

(我希望我没有忘记任何!)在你的情况下,你可以通过简单的写作实现你想要的东西

\

您可能会问“test (_, NOT (WIRE _)) = 1 test (_, AND (WIRE _) (WIRE _)) = 2 test _ = 0 ”的正确版本是什么。好吧,你可以写:

pattern == (_, NOT (WIRE _))

答案 1 :(得分:0)

为什么你需要警卫呢?我错过了什么吗?下面是我认为你正在寻找的合法的Haskell代码。

test (_,NOT (WIRE _)) = 1     
test (_,AND (WIRE _) (WIRE _)) = 2
test _ = 0