Squ*_*oot 4 sml pattern-matching
我只是想知道这里的 XL 变量是什么,它没有在任何地方声明?如果字符串不在列表中,则此函数返回 NONE。否则,返回原始字符串列表,但没有匹配的字符串。
fun same_string(s1 : string, s2 : string) =
s1 = s2
fun all_except_option(s1: string, lst: string list) =
case lst of
[] => NONE
| x::xl => if same_string(s1, x) (* XL HERE ?? *)
then SOME xl
else case all_except_option(s1, xl) of
NONE => NONE
| SOME l => SOME (x::l)
Run Code Online (Sandbox Code Playgroud)
正如 melpomene 上面评论的那样,xl该行实际上是的声明xl。
在标准机器学习中,变量是通过使用模式来声明(绑定)的,然后与值进行匹配。val即使使用;也是如此。例如,我们可以写:
val (x, y) = (1, "y")
Run Code Online (Sandbox Code Playgroud)
声明x(将其绑定到1)和y(将其绑定到"y")。
在case表达式和fn表达式中,模式匹配还兼作条件;例如,这个:
val rec sum =
fn nil => 0
| h :: t => h + sum t
Run Code Online (Sandbox Code Playgroud)
创建一个函数来检查其参数是否为nil,在这种情况下它会做一件事,而如果它的参数具有以下形式(意味着非空列表),在这种情况下它会做另一件事(使用这些值)。(假设,如果参数不具有这两种形式,那么该函数最终将引发;但实际上,类型的任何值都将必然具有这两种形式之一,因此该函数永远不会引发。)value1 :: value2Matchint listMatch
顺便说一句,请注意该示例使用值标识符nil和::,但没有声明它们;而它确实声明了值标识符h和t。这种不一致可能看起来很奇怪。其原因是nil和::是值构造函数,这意味着它们是使用datatype( datatype 'a list = nil | :: of 'a * 'a list) 声明的,因此它们可以在模式中使用。像这样的东西:
val nil = 3
Run Code Online (Sandbox Code Playgroud)
实际上是完全非法的,因为引用的是已经声明的构造函数,并且和nil的类型不兼容。相比之下,如果标识符还不是值构造函数,则模式中的出现就构成了声明(即使标识符已经是值变量:新声明将简单地隐藏现有声明)。对于该语言的新手来说,这可能有点棘手,但是只要有一点经验,您就会发现它很有意义。nil3