模式与逻辑匹配?

DΦC*_*WTF 3 ocaml functional-programming pattern-matching

我不知道是否有一种方法可以做这样的事情(x, y < 0, z)y < 0

在我的例子中有三种情况y = 0,y < 0否则.

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

let rec f = function
    | (x, 0, y) -> x
    | (x, y < 0, z) -> f (x y z)
    | (x, y, z) -> f (z y x)
Run Code Online (Sandbox Code Playgroud)

只是你知道,我在递归调用中删除了元组的复杂性,所以函数现在没有任何意义.

sep*_*p2k 5

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

这将导致无限递归,因为f (x, y, z)不会改变有关参数的任何内容,但我认为您的实际代码中不存在该问题.