Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 模式匹配与逻辑?_Functional Programming_Pattern Matching_Ocaml - Fatal编程技术网

Functional programming 模式匹配与逻辑?

Functional programming 模式匹配与逻辑?,functional-programming,pattern-matching,ocaml,Functional Programming,Pattern Matching,Ocaml,我想知道是否有一种方法可以像这样做(x,yx |(x,y,z)当yf(x,y,z) |(x,y,z)->f(z,y,x) 这将导致无限递归,因为f(x,y,z)不会改变有关参数的任何内容,但我假设实际代码中不存在这个问题

我想知道是否有一种方法可以像这样做
(x,y<0,z)
y<0

在我的示例中有三种情况,
y=0
y<0
和else

我知道如何用不同的方法实现这个功能,但是 我只是喜欢这种方式,想知道这在某种程度上是否可行

let rec f = function
    | (x, 0, y) -> x
    | (x, y < 0, z) -> f (x y z)
    | (x, y, z) -> f (z y x)
让rec f=函数
|(x,0,y)->x
|(x,y<0,z)->f(x,y-z)
|(x,y,z)->f(zyx)

正如您所知,我在递归调用中删除了元组的复杂性,因此该函数现在没有任何用途。

您可以使用
when
关键字在模式后添加一个条件。有了它,您可以像这样做:

let rec f = function
    | (x, 0, y) -> x
    | (x, y, z) when y < 0 -> f (x, y, z)
    | (x, y, z) -> f (z, y, x)
让rec f=函数
|(x,0,y)->x
|(x,y,z)当y<0->f(x,y,z)
|(x,y,z)->f(z,y,x)
这将导致无限递归,因为
f(x,y,z)
不会改变有关参数的任何内容,但我假设实际代码中不存在这个问题