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

Posted

tags:

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

我刚刚设计了一个无用的功能:

let rec f = fun x y-> 
    let tmp = f (x-1) y in (match tmp with | y->y|m->m);;

为什么m->m未使用匹配?为什么这里的y->y实际上是一个通配符,而不是参数y的值?我想做的是如下:

let rec f = fun x y ->
    let tmp = f (x-1) y in if tmp=y then y else tmp;;

为什么模式匹配不起作用?作为回答,请解决问题,而不是建议采取必要的方法。谢谢!

答案

y中的match tmp with y -> y | m -> m是一个(新的)变量。因此它匹配任何值。

尝试评估此表达式:

(fun x -> match x with y -> y + 1 | w -> w + 2) 3;;

结果是4x在应用函数时与3绑定; 3与变量y匹配;最后,子表达式y + 1[ x = 3; y = 3]的上下文中评估为4。

子表达式if tmp=y then y else tmp相当于简单的tmp

为什么要在整数上进行模式匹配?你的功能应该是什么?

另一答案

使用when来克服它。

let rec f = fun x y-> 
    let tmp = f (x-1) y in (match tmp with |_ when tmp = y->y|m->m);;

以上是关于Ocaml模式匹配:为什么不使用此匹配?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 OCaml 模式匹配比 Erlang 弱?

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

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

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

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

排序算法中的 OCaml 匹配 0(n^2)