Ocaml模式匹配"方形"元组?

Tru*_*ure 4 ocaml functional-programming pattern-matching

在尝试学习Ocaml和函数式语言时,我一直在研究模式匹配.我正在阅读这份文档,并决定为自己尝试以下练习:

创建一个表达式,计算true输入整数4元组的时间,使得4元组中的每个元素相等.

(4,4,4,4) - > true

(4,2,4,4) - > false

我发现做模式匹配对于元素值的特异性来说并不明显.这是我写的代码.

let sqr x = match x with 
   (a, a, a, a) -> true 
 | (_, _, _, _) -> false ;;
Run Code Online (Sandbox Code Playgroud)

当然,此代码会引发以下错误:

Error: Variable a is bound several times in this matching

我怎么能不仅强制执行x是一个4元组,还有严格的整数相等?

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

Jul*_*ren 8

正如您所发现的,与其他语言的模式匹配系统不同,您无法在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
Run Code Online (Sandbox Code Playgroud)

  • @TrueAzure由于只使用了比较运算符,它们在OCaml中是多态的,因此`sqr`接受任何(单一)类型的元组.`\`Equal`和朋友是[多态变体](https://caml.inria.fr/pub/docs/manual-ocaml-4.06/lablexamples.html#sec46) (2认同)