我正在尝试添加给定整数列表中的所有元素,最后返回一个整数作为其总和
以下是我尝试过的代码
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 非常简单:
列表的总和是
请注意,任何地方都没有变量,也没有赋值。
理想情况下,您应该使用二元运算将整个列表减少为单个元素。在标准机器学习中,您可以使用
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
因此,我正在研究另一个问题,并且也找到了该问题的解决方案。
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操作的工作原理类似,但在使用方面当然有所不同。
我不知道我们可以通过这种方式将元素作为参数传递给函数。这很有趣。