3

私は頭を包み込もうとしてきましfold_leftfold_right。練習として、私は多くの関数を書き直し、知識を強化しようfold_leftとしています。fold_rightたとえば、リストの平均を見つけるには、フォールドを使用してリストの合計と長さを計算します。

let sum_l xs = List.fold_left (fun x y -> x + y) 0 xs;;
let len_l xs = List.fold_left (fun x _ -> x + 1) 0 xs;;

そして、平均を見つけることに進みます。これが私の質問です。これらの値の両方を 1 つの単一にすることは可能fold_leftですか? 匿名関数はどのように記述すればよいですか? ありがとう!

4

1 に答える 1

6

アキュムレータとしてペアを使用するだけです。

# let sum_and_len xs = List.fold_left (fun (s,l) x -> s+x, l+1) (0,0) xs;;
val sum_and_len : int list -> int * int = <fun>
# sum_and_len [0;1;2;3];;
- : int * int = (6, 4)
于 2013-09-20T07:46:19.473 に答える