我想做一个案例,它将为某个数字 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。