Haskell-在模式中保护的右侧使用通配符

Haskell-在模式中保护的右侧使用通配符,haskell,pattern-matching,guard,Haskell,Pattern Matching,Guard,假设我有这样一段代码: test pattern | pattern == (_,NOT (WIRE _)) = 1 | pattern == (_,AND (WIRE _) (WIRE _)) = 2 | otherwise = 0 在这里,我试图将它与几种可能性中的一种进行匹配,有些是一(WIRE“”),有些是两种。我的实际输入如下所示,例如:(“p”,而不是(导线“x”))。我希望有一个模式,可以接受任何字母作为输入(这是我所希望的),但失败惨重(非法)。在haskell

假设我有这样一段代码:

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

在这里,我试图将它与几种可能性中的一种进行匹配,有些是一(WIRE“”),有些是两种。我的实际输入如下所示,例如:(“p”,而不是(导线“x”))。我希望有一个模式,可以接受任何字母作为输入(这是我所希望的),但失败惨重(非法)。在haskell有可能做到这一点吗

你为什么需要警卫?我错过什么了吗?下面是我想你要找的Haskell法律代码

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

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

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

  • 在(图案)装订的左侧,即“在
    =
    之前是什么”,在顶层或
    中,其中
    块或
    中,让
    表达式或命令(在
    标记中)
    
  • 案例中
    表达式的左侧
  • 作为函数的形式参数,在函数绑定或lambda(
    \
    )表达式中
(我希望我没有忘记!)在你的情况下,你可以通过简单的写作来实现你想要的

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

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

case pattern of
  (_, NOT (WIRE _)) -> True
  _ -> False

字符串是一个列表。要对列表进行模式匹配,可以使用列表构造函数(:)。如果您想要模式匹配一个元素列表,请尝试“x:[]”或“:[]”是否应该相互匹配(在同一个保护中)?这个问题有一些令人困惑的地方,但您应该从根本不使用保护开始,而只使用一系列等式,如
test(u,not(WIRE u))=1
@LarsH不,提供的实际输入将使它们与px匹配。或者如果有两根电线,那么就说@里德,谢谢!为什么它是这样工作的,而不是在一个守卫内?为了进一步阐述里德的想法,使用以下方法:test2(,not(WIRE)))=1 test2(,and(WIRE)(WIRE)))=2最好的默认(否则)情况是什么,即test2)=0等效。这不起作用,我想说的是任何其他输入=0。谢谢谢谢你,这会让事情变得明朗一些。作为哈斯凯尔还有一段时间,直到我觉得完全适应它虽然…伟大的答案。。。教育和解决方案。:-)我认为还应该指出相反的情况:在模式匹配中,所有标识符都是模式而不是值。因此,
NOT
WIRE
需要是数据构造函数或(字符串或数字)文本才能工作。在本例中,它是有效的,因为它们是大写的。学习Haskell的人经常会在某个时候被这个问题绊倒。例如,您无法通过模式匹配对常量进行测试-
f someNum=error“not that!”
f x | x==someNum=error“not that!”
完全不同。