Ocaml模式匹配“方形”元组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ocaml模式匹配“方形”元组?相关的知识,希望对你有一定的参考价值。

在尝试学习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元组,还有严格的整数相等?

(当然,“正方形”元组不应该允许非正整数,但我现在更关心上述问题)。 `

答案

正如您所发现的,与其他语言的模式匹配系统不同,您无法在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
另一答案

你有很多方法可以进行模式匹配,模式匹配不仅仅是在使用match关键字时

let fourtuple_equals (a,b,c,d) = List.for_all ((=) a) [b;c;d]
val fourtuple_equals : 'a * 'a * 'a * 'a -> bool = <fun>

在这里,您可以直接在参数中匹配模式,以便访问您的四个元素元组。

在这个例子中,我使用一个列表来获得更简洁的代码,但效率并不高。

以上是关于Ocaml模式匹配“方形”元组?的主要内容,如果未能解决你的问题,请参考以下文章

OCaml 中的模式匹配和嵌套模式匹配

为啥 OCaml 模式匹配比 Erlang 弱?

Ocaml模式匹配:为什么不使用此匹配?

OCaml:在另一个内部匹配表达式?

ocaml 中的匹配是不是调用构造函数?

OCaml 中的交错