机器学习编程中的竖线(|)是什么意思?
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)
例如下面的函数:
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)