gpt4 book ai didi

pattern-matching - SML 中的模式匹配?

转载 作者:行者123 更新时间:2023-12-05 01:45:32 26 4
gpt4 key购买 nike

我只是想知道这里的 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)

最佳答案

正如 melpomene 上面评论的那样,该行上的 xl 实际上 xl 的声明。

在标准 ML 中,变量通过使用模式声明(绑定(bind)),然后与匹配。即使使用 val 也是如此;例如,我们可以这样写:

val (x, y) = (1, "y")

声明 x(绑定(bind)到 1)和 y(绑定(bind)到 "y")。

case 表达式和 fn 表达式中,模式匹配也兼作条件;例如,这个:

val rec sum =
fn nil => 0
| h :: t => h + sum t

创建一个函数来检查它的参数是否为 nil ,在这种情况下它做一件事,如果它的参数具有形式 <i>value</i><sub>1</sub> :: <i>value</i><sub>2</sub> (意味着非空列表),在这种情况下它做不同的事情(使用这些值)。 (假设地,如果参数没有这些形式,那么函数最终会引发 Match ;但碰巧的是,类型为 int list任何值将强制具有这两种形式之一,因此该函数永远不会引发 Match 。)

顺便说一句,请注意该示例使用值标识符 nil:: ,但没有声明它们;而它确实声明了值标识符 ht 。这种不一致可能看起来很奇怪;原因是 nil:: 是值构造函数,这意味着它们已使用 datatype ( datatype 'a list = nil | :: of 'a * 'a list ) 声明,因此它们可以在模式中使用。像这样:

val nil = 3

其实是完全不合法的,因为nil指的是已经声明的构造函数,而nil3的类型是不兼容的。相比之下,如果标识符不是已经是一个值构造函数,那么在模式中的出现就构成了一个声明(即使标识符已经一个值变量:新的声明将简单地隐藏现有的声明)。对于该语言的新手来说,这可能有点棘手,但只要有一点经验,您就会发现它很有意义。

关于pattern-matching - SML 中的模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41527220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com