一般来说,在尝试学习Ocaml和函数式语言时,我一直在研究模式匹配。我正在阅读this documentation,并决定为自己尝试以下练习:
当输入整数4元组时,使表达式求值为true
,使得4元组中的每个元素相等。
(4,4,4,4) - > true
(4,2,4,4) - > false
我发现做模式匹配对于元素值的特异性来说并不明显。这是我写的代码。
let sqr x = match x with
(a, a, a, a) -> true
| (_, _, _, _) -> false ;;
当然,此代码会引发以下错误:
Error: Variable a is bound several times in this matching
我怎样才能不仅强制执行x是4元组,还有严格的整数相等?
(当然,“正方形”元组当然不应该允许非正整数,但我现在更关心上述问题)。 `
答案 0 :(得分:7)
正如您所发现的,与其他一些语言不同,'模式匹配系统,你不能在OCaml中做到这一点。你可以做的是分别匹配元组的每个元素,同时使用守卫只有在某些属性(如等价)跨越它们时才会成功:
let sqr x =
match x with
| (a, b, c, d) when a = b && b = c && c = d -> `Equal
| (a, b, c, d) when (a < b && b < c && c < d)
|| (a > b && b > c && c > d) -> `Ordered
| _ -> `Boring
答案 1 :(得分:0)
您可以通过多种方式进行模式匹配,模式匹配不仅适用于使用匹配关键字
let fourtuple_equals (a,b,c,d) = List.for_all ((=) a) [b;c;d]
val fourtuple_equals : 'a * 'a * 'a * 'a -> bool = <fun>
在这里,您可以直接在参数中匹配模式,以便访问您的四个元素元组。
在这个例子中,我使用一个列表来获得更简洁的代码,但效率并不高。