【问题标题】:What does double colon mean in SML when summing up list of numbers?总结数字列表时,SML 中的双冒号是什么意思?
【发布时间】:2023-11-03 05:46:01
【问题描述】:

我不太明白以下函数背后的逻辑。此函数用于汇总列表中的数字。但是导师并没有过多地讲述::在这里做了什么。 教程中的原始列表在列表中有 5 个数字/项目 (1,3,5,7,9)。我以为导师先用五个字母(a,r,e,s,t)命名这些项目,但功能仍然适用于项目多于或少于 5 个的列表。那怎么会呢?

- fun sum([]) = 0 | sum(a::rest)= a + sum(rest);

据我所知,a rest 不是特定于语言的命令。它们必须是用户定义的。

我在 SML 文档中找到了以下信息,但对于掌握 :: 概念仍然没有任何意义。

datatype 'a list = nil | :: of 'a * 'a list

【问题讨论】:

  • 使用:: 您只是将列表(提前)分解为第一个元素(在您的情况下为a)和一个尾部(或rest):a 和@ 987654331@ 只是变量,您可以随意命名它们。
  • @barti_ddu 知道了!根据上面的列表,这一定是这样的:当a=1时,rest=3,从现在开始的新“a”是1+3=4。那么a=4,rest=5,从现在开始新的“a”就是4+5=9..以此类推。
  • 不完全是:tail 是分解后列表的剩余部分(列表减去第一个元素),即第一次迭代后的[3; 5; 7; 9],第二次迭代后的[5; 7; 9],依此类推开。

标签: sml smlnj


【解决方案1】:

感谢@barti_ddu,我想回答这个问题。

列表 [1,3,5,7,9] 的分解工作如下:

- fun sum([]) = 0 | sum(first::tail)= first + sum(tail);

first 表示列表中的第一项 (1)。

tail表示取出第一项(1)后列表中剩余的项(3,5,7,9)

所以它看起来像:

1 + sum([3,5,7,9])

sum([3,5,7,9]) 等于什么?那么,根据上面的函数它等于:

sum(first::tail)= first + sum(tail)

换句话说:

sum([3,5,7,9])= 3 + sum([5,7,9])

我们不要忘记上面的1 + sum([3,5,7,9]) 并显示整个字符串:

1 + 3 + sum([5,7,9])

如果我们重复它直到字符串的末尾,它将是这样的:

1 + 3 + 5 + 7 + 9 + sum([])

这最终将等于25 + sum([])

从上面的函数sum([]) 等于0(零)。

所以结果是 25 + 0 = 25。

注意:如果我们用5 代替空列表的0,结果将等于25 + 5 = 30

【讨论】:

    最近更新 更多