机器学习编程中的竖线(|)是什么意思?

What does pipe ( | ) mean in ML Programming?

例如下面的函数:

fun fac (0 : int) : int = 1
  | fac (n : int) : int = n * fac (n - 1)

或者在函数中:

fun even 0 = true
  | even x = odd(x-1)
and odd 0 = false
  | odd x = even(x-1);

我对 ML 的经验很少,我只是想了解基础知识。

这是pattern matching。来自 link:

Functions may be composed of one or more rules. A rule consists of its function-name, an argument pattern and its expression. When the function is called the argument values will be matched to the patterns in top down order. Functions using pattern-matching are very similar to case expressions

这意味着管道将大小写分开以进行模式匹配。模式匹配匹配特殊模式并根据该模式执行特定表达式。它们遵循语法:

fun <fun-name> <pattern>
  | <fun-name> <pattern>
  | <fun-name> <pattern>;

其中 <pattern> 是:

<args> = <expressions>

在您的第一个示例中,它声明函数 fac 用于阶乘计算。第一种模式是当参数 int 为 0 时。如果 int 为 0,则执行该情况的表达式,在这种情况下,如果传递的参数为 0,则结​​果将为 1 (因为 0 的阶乘是 1)。如果传递的参数 不是 0 则它遵循下一个模式(因为它不匹配第一个模式)。如果传递的参数是 2,它将执行递归并相应地找到阶乘。


考虑下面的代码片段:

fun past "run"  = "ran"
  | past "swim" = "swam"
  | past x      = x ^ "ed";

我们定义名为 past 的函数,它接受一个参数并找到参数的传递时态。第一个模式相当于 - 用简单的英语来说:

如果单词(或传递的参数)是 "run",则传递的时态是 "ran"

第二个模式等同于:

如果单词(或传递的参数)是 "swim",则传递的时态是 "swam"

如果单词既不是 "swim" 也不是 "run"(因此两个模式不匹配)继续最后一个模式,它只是将 "ed" 添加到字.

通过示例,您可以看到 |(竖线)符号分隔模式。你可以想到这样的伪代码模式:

if argument is "run", then passed tense is "ran"
else if argument is "swim", then passed tense is "swam"
else add "ed" to end of word

模式匹配用于覆盖不规则的情况。由于 "ran" 和 "swam" 是不规则的过去时态,我们用模式来覆盖这些情况。完全相同的原则适用于第一个示例 - 0!是一个特例,它是1。因此,我们可以使用模式匹配来匹配参数为0的特定情况,并根据该特定情况执行。

您看到的是同时在参数上定义函数和模式匹配的快捷语法。如果你从函数定义中分离出模式匹配,它看起来像这样:

fun fac (x : int) : int =
  case x of
    0 => 1
  | n => n * fac (n - 1)