Rya*_*ith 6 ml sml pattern-matching
例如以下功能:
fun fac (0 : int) : int = 1
| fac (n : int) : int = n * fac (n - 1)
Run Code Online (Sandbox Code Playgroud)
或者在功能中:
fun even 0 = true
| even x = odd(x-1)
and odd 0 = false
| odd x = even(x-1);
Run Code Online (Sandbox Code Playgroud)
我对ML的经验很少,我只是想了解基础知识.
这是模式匹配.从链接:
功能可以由一个或多个规则组成.规则由其函数名,参数模式及其表达式组成.调用该函数时,参数值将以自上而下的顺序与模式匹配.使用模式匹配的函数与case表达式非常相似
这意味着管道将箱子分开以进行模式匹配.模式匹配匹配特殊模式并基于该模式执行特定表达式.他们遵循以下语法:
fun <fun-name> <pattern>
| <fun-name> <pattern>
| <fun-name> <pattern>;
Run Code Online (Sandbox Code Playgroud)
在哪里<pattern>:
<args> = <expressions>
Run Code Online (Sandbox Code Playgroud)
在您的第一个示例中,它声明fac了因子计算的功能.第一个模式是当参数int为0时.如果int为0,则执行该情况的表达式,在这种情况下,如果传递的参数为0,则结果将为1(因为0 factorial为1).如果传递的参数不为0,则它遵循下一个模式(因为它与第一个模式不匹配).如果传递的参数是2,那么它将执行递归并相应地找到阶乘.
考虑下面的代码:
fun past "run" = "ran"
| past "swim" = "swam"
| past x = x ^ "ed";
Run Code Online (Sandbox Code Playgroud)
我们定义past了一个名为的函数,它接受一个参数并找到参数的传递时.第一种模式相当于 - 用简单的英语:
如果单词(或传递的参数)是"run",则传递的时态为"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
Run Code Online (Sandbox Code Playgroud)
模式匹配用于覆盖不规则的情况.由于"跑"和"游"是不规则通过时态,我们用模式覆盖那些案例.完全相同的原则适用于第一个例子 - 0!是一个特例,它是1.因此,我们可以使用模式匹配来匹配参数为0的特定情况,并根据该特定情况执行.