当函数返回函数作为结果时,让我们说:
let func = function
| pat -> (function | pat -> x
| b -> y)
两个pat
不是同一个东西,第二个pat
可以匹配任何东西,所以永远不会到达最后一行。有关如何解决这个问题的任何提示?
答案 0 :(得分:2)
如果您想表示第二个pat
应该等于代码中第一个pat
的匹配值,那么您的代码是错误的。必须是:
let func = function pat ->
function
| pat' when pat = pat' -> x
| b -> y
模式变量引入新的新变量,不能引用绑定到同名变量的值。
答案 1 :(得分:0)
您不应仅仅使用模式匹配来测试相等性。您应该使用if then else
。
您的功能相当于:
let func a b if a = b then x else y
使用警卫(camlspotter的答案的when
部分)会起作用,但风格很糟糕(caml编译器常常抱怨它)。