3

可以说我有一段这样的代码:

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

我试图将它与几种可能性之一相匹配,一些与一个(WIRE“”),一些与两个。我的实际输入如下:(“p”,NOT(WIRE“x”))。我想要一个可以接受任何字母作为输入的模式(我希望使用 _)并且失败得很惨(非法 _)。有可能在haskell中做到这一点吗?

4

2 回答 2

7

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

==比较,但_它是一种模式。模式仅出现在以下句法上下文中:

  • 在(模式)绑定的左侧,即“之前的内容=”,在顶层或在where块中或在let表达式或命令中(以do符号表示);
  • <-do符号或列表理解的左侧;
  • ->case表达式的左边;
  • 作为函数的形式参数,无论是在函数绑定还是 lambda ( \) 表达式中。

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

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

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

case pattern of
  (_, NOT (WIRE _)) -> True
  _ -> False
于 2010-09-27T05:24:00.493 回答
0

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

test (_,NOT (WIRE _)) = 1     
test (_,AND (WIRE _) (WIRE _)) = 2
test _ = 0
于 2010-09-27T05:21:05.470 回答