OCaml:返回函数的函数

OCaml:返回函数的函数,ocaml,Ocaml,当函数返回一个函数作为结果时,假设: let func = function | pat -> (function | pat -> x | b -> y) 两个pat不是同一个东西,第二个pat可以匹配任何东西,因此永远不会到达最后一行。有没有关于如何解决这个问题的提示 如果要表示代码中第二个pat应等于与第一个pat匹配的值,则代码是错误的。它必须是: let func = function pat -> function

当函数返回一个函数作为结果时,假设:

let func = function
| pat -> (function | pat -> x
                   | b -> y)

两个
pat
不是同一个东西,第二个
pat
可以匹配任何东西,因此永远不会到达最后一行。有没有关于如何解决这个问题的提示

如果要表示代码中第二个
pat
应等于与第一个
pat
匹配的值,则代码是错误的。它必须是:

let func = function pat ->
  function 
    | pat' when pat = pat' -> x
    | b -> y

模式变量引入新的新变量,并且不能引用绑定到同名变量的值。

您不应该仅为了测试相等性而使用模式匹配。您应该使用
if-then-else
。 您的功能相当于:

let func a b if a = b then x else y

使用防护(camlspotter答案中的
部分时使用
)会起作用,但风格不好(caml编译器过去常常对此表示不满)。

谢谢!我是Ocaml的新手。现在我明白了原因。我所记得的关于保护的唯一警告涉及到所有分支都被保护的情况(因为编译器无法确定匹配是否详尽)。在当前版本中,这仍然是一个警告,但这里的情况并非如此(尽管我同意在这种非常具体的情况下,
if-then-else
match
更有意义)。