2016-09-29 6 views
6

私は過去数時間にわたってこれを把握しようとしてきました。リスト内のサブリストの合計を返します

のは、私はサブリストを合計し、以下のように1つのリストを返す関数を作成する必要がint型

let list = [[1;3;4;4];[1;3]] 

のリストのリストを持っているとしましょう:

[12;4] 

私がしてきました私はList.foldを使うべきだと言った。

私は次のことを試してみた:

let list = [2;3;5] 
let sumList list = List.fold (fun acc elem -> acc + elem) 0 list 
sumList list 

これが唯一のint型を返すだけのintリストのではなく、リストのリストのために動作されます。ここから次のステップは何ですか?

+1

List.mapは次のヒントです –

+0

私がばかだと申し訳ありません。私は関数型プログラミングでは非常に新しいです。 私はList.mapのドキュメントを見て、各要素に与えられた関数を適用することを理解しました。 は、私はこれを実行しようとしました: 'sumListsリストを聞かせて= List.map(楽しいX - > List.fold(楽しいACCのelem - > ACC +のelem)0リスト)明らかに –

+0

最初に動作していない' は、書き込み関数はリストを合計します。次に、list.mapで新しい関数を書く –

答えて

6

試してみてください。

list 
|> List.map List.sum 

ですから、リストの各要素に対してList.sumをマップします。

それとも倍と:

list 
|> List.map (List.fold (+) 0) 

(List.fold (+) 0)は、SUM関数と同じです。これはゼロで始まり、各反復で値をアキュムレータに追加します。

list 
|> List.fold (fun acc v -> 
    acc @ [(List.fold (+) 0) v]) [] 

表示されているように、マップを折り畳みに置き換えることもできます。 List.foldBack

list 
|> List.foldBack (fun v acc -> 
    (List.fold (+) 0 v) :: acc) 
    <| [] 

それが倍よりも私の意見では少し良く見えます。しかし、私は最初の解決法を好む。

+0

ありがとう!これは優れています。 –

+2

そして最後の解決法よりも読みやすいと思うList.foldBack(fun v acc - >(List.fold(+)0 v):: acc) 'を忘れないでください( '<|'を使用して)。 – ildjarn

関連する問題