如何在SML中添加列表中的所有元素

问题描述 投票:0回答:3

我正在尝试添加给定整数列表中的所有元素,最后返回一个整数作为其总和

以下是我尝试过的代码

val intList = [1,2,3,4];

fun addList (list) = 
let
  val head = List.hd list
  val tail = List.tl list
  val sum = ref 0
in
  if(list <> [])
  then sum := !sum + head
  addList(tail)
  else !sum
end;

但是,我收到以下错误

细化失败:类型冲突。由于循环性,“'a”类型的表达式不能具有“(('a → 'b) → 'c → 'd) List.list”类型。

我对 SML/NJ 还很陌生 我可能做错了什么?

sml smlnj
3个回答
2
投票

你已经走错了路——你甚至不应该考虑推荐信或作业。
(事实上,你可能永远不会使用它们。)

这是总体思路 - 翻译成 SML 非常简单:

列表的总和是

  • 如果列表为空,则为零
  • 否则,将列表的头部添加到列表尾部的总和中。

请注意,任何地方都没有变量,也没有赋值。


0
投票

理想情况下,您应该使用二元运算将整个列表减少为单个元素。在标准机器学习中,您可以使用

List.foldl
函数来完成此操作。

> val sum = List.foldl op+ 0 [1, 2, 3, 4];
val sum = 10: int

这本质上是在连续元素之间放置 + 并计算为

> val sum = (((0 + 1) + 2) + 3) + 4;

op+
是一种将运算符传递给函数的方法。 https://stackoverflow.com/a/54814038/5956245

https://smlfamily.github.io/Basis/list.html#SIG:LIST.foldl:VAL


0
投票

因此,我正在研究另一个问题,并且也找到了该问题的解决方案。

val intList = [3,7,5,6];

fun addList (list, x)=
if list = []
then x
else
let
  val head = hd(list)
in
  addList(tl(list), x + head)
end;


val something = addList(intList, 0);

与foldl操作的工作原理类似,但在使用方面当然有所不同。

我不知道我们可以通过这种方式将元素作为参数传递给函数。这很有趣。

© www.soinside.com 2019 - 2024. All rights reserved.