私はこの問題を解決しようとしています
演習 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 演算子が機能しなかった理由と、新しいリストの追加操作が機能した理由がわかりません。
cons 演算子は、単純に新しい項目をリストに追加し、新しいリストを再帰呼び出しの最初のパラメーターとして返す必要がありますか?
どうしたの?