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
更有意义)。