我想做一个案例,它将为某个数字 n 给出一个结果 (42),为 n + 1 给出另一个结果 (43),为其他所有结果给出第三个结果 (44)。我正在尝试这样做:
f x = let n = 4 in case x of {n -> 42; n+1 -> 43; _ -> 44}
不起作用。我认为是因为您不能在模式中使用表达式 (n+1)。我正在尝试通过警卫:
f x = let n=4 in case x of {n -> 42; _ | x == n+1 -> 43 | True -> 44}
也不行。写一个额外的模式。如何使最短的权利?
简而言之
一般来说,模式匹配不是比较,而是使用比较不可用的更原始的机制,但它们本身不能做所有可用于比较的事情(例如,与变量进行比较)。但就您而言,仅进行比较是值得的。
结合案例
甚至如此,尽管它们不是同一回事(这里在
min
/的实现中使用了比较max
)更长
进行了比较
Nothing
, ,Left 5
,([1], Just (Right 2))
,[]
1
,'x'
,"test"
x
,y
,somethingElse
.任何表达式都与变量成功匹配。所以它们的作用不是与它们进行比较,而是将匹配表达式的一部分与变量名称相关联。也就是粗略的说,给这个地方的变量赋值。
在此示例中,整个右侧
n
将为 5更复杂的表达式也是如此。
这里的意思是:如果表达式
Left 2
与模式匹配Left n
,那么等于什么n
?在这种情况下,两个。即使同名变量已经存在,它也会在映射的右侧显示为灰色。
n
因此,两个例子会得到相同的结果(并且不涉及变量的值为0 )模式匹配表达式
n + k
曾经是语言的一部分。编译器仍然支持它们,但默认情况下它们是禁用的,并且它们仍然不会执行您想要的操作。那些。在这种情况下,我们匹配
5
样本n + 1
,然后n
它将等于 4,因为如果n = 4
我们将其与 having 相加1
,我们将得到 5。