【发布时间】:2011-04-17 14:14:51
【问题描述】:
假设我有一段这样的代码:
test pattern
| pattern == (_,NOT (WIRE _)) = 1
| pattern == (_,AND (WIRE _) (WIRE _)) = 2
| otherwise = 0
我试图将它与几种可能性之一进行匹配,一些与一种(WIRE“”),一些与两种。我有如下实际输入,例如:(“p”,NOT(WIRE“x”))。我想要一个可以接受任何字母作为输入的模式(我希望使用 _)并且失败得很惨(非法 _)。有可能在haskell中做到这一点吗?
【问题讨论】:
-
字符串是一个列表。要对列表进行模式匹配,请使用列表构造函数 (:)。如果要对单元素列表进行模式匹配,请尝试“x:[]”或“_:[]”
-
_是否应该相互匹配(在同一个警卫内)?
-
关于这个问题有几个令人困惑的地方,但你应该从根本不使用守卫开始,而只是像
test (_, NOT (WIRE _)) = 1这样的一系列方程。 -
@LarsH 不,他们提供的真实输入将使它们与 p x 匹配。或者如果有两条线 p x x 说。 @里德谢谢!为什么它是这样工作的,而不是在守卫内?
-
为了进一步 Reid 的想法,使用这个: test2 (,NOT (WIRE _)) = 1 test2 (,AND (WIRE _)(WIRE _)) = 2 what是最好的默认(否则)情况,即 test2 _ = 0 等效。这不起作用,我想说的是任何其他输入 = 0。谢谢!
标签: haskell pattern-matching guard