#始めに
F#のfold,scanについての覚書をアップします
ついでに、関数のシグネチャの読み方もアップします
#関数のシグネチャの読み方の自分なりのポイントについて
- T,U :イミュータブルな値
- ():リストをトラバースするときに適用する関数、またはラムダ式
- State : ミュータブルな状態を表す。すなわち、関数やラムダ式の適用によって値が変化する値を格納する変数みたいなもの
#ソース
module File4
//fold , scanをつかう
let list = [1;2;3;4;5]
//foldを実行する
List.fold(fun acc b -> acc+b) 0 list |> printfn "%d"
///foldのシグネチャは以下の通り
///List.fold : ('State -> 'T -> 'State) -> 'State -> 'T list -> 'State
///例として「リストの3番目の要素、3に対して処理を実行するとき 」を取り上げる
///第1引数:('State -> 'T -> 'State) はリストをトラバースするときに適用するラムダ式を渡す
///ラムダ式の引数の内容は以下の通り
///第1引数
///'State:foldが実行される前の状態が渡される
///今回の例では(1+2)が渡される
///第2引数
///'T:今回の演算対象が渡される 。今回の例では3が渡される
///戻り値
///'State:リストをトラバースするときに適用した関数の実行結果が設定される
///今回の例では第一引数と第二引数の演算結果、すなわち(1+2) + 3が適用される
///第2引数:'State foldを実行する前の状態を渡す。今回の例では0が設定される
///第3引数:'T list foldの演算対象となるlistを渡すlistの型はリストに格納されている値に依存する
///戻り値 State 第3引数で指定したlistに対して第1引数で渡したラムダ式を適用した結果をを返す
///今回の例では(1+2+3+4+5)、つまり15が返却される
///scanを実行する
///scanのシグネチャは以下の通り
///('State -> 'T -> 'State) -> 'State -> 'T list -> 'State list
///基本的にfoldと使い方は同じだが、最後の戻り値が違う
///戻り値にはscanの0回目~n回目までの実行結果が格納されている
List.scan(fun acc b -> acc+b) 0 list |> printfn "%A"