我正在尝试解决这个问题
练习 8.3 编写一个函数,接受一个数字列表并返回累积和;也就是说,一个新列表,其中第 i 个元素是原始列表中前 i + 1 个元素的总和。例如,[1, 2, 3] 的累积和为 [1, 3, 6]。
我写了这段代码,据我所知是正确的。
let lastItem = function
| [] -> 0
| l -> List.hd (List.rev l);;
let rec cumulativeSumActual accum input =
match input with
| [] -> accum
| hd::tl -> cumulativeSumActual (accum::[(lastItem accum) + hd]) tl;;
let cumulativeSum = cumulativeSumActual [];;
let output = cumulativeSum [1; 2; 3;];;
let printer item =
print_int item
print_string "\n";;
List.iter printer output
但我得到了错误
user1@ubuntu:~/Documents/Programs$ ocamlc -o CumulativeList CumulativeList.ml
File "CumulativeList.ml", line 8, characters 33-38:
Error: This expression has type 'a list
but an expression was expected of type 'a
然后我将代码更改为
| hd::tl -> cumulativeSumActual (accum@[(lastItem accum) + hd]) tl;;
它奏效了!
但是我不明白为什么 cons 运算符不起作用,为什么 new list append 操作起作用?
cons 运算符应该简单地向列表中添加一个新项目,然后将新列表作为递归调用的第一个参数返回?
这是怎么回事?