aux関数 少しまとめ
前からの結果が必要(回数を数えるcount, 経路を覚えとくpathList)
ー> 補助関数を使う
ー> countなどを引数として渡す(引数の意味はコメントに書いておくこと)
結果が複数あるもの
ー> 結果が出たらaccに詰めて、引数として渡す
ー> 最後にaccを返せば出来上がり(accも結果が入って最終的に返すものってコメントが有ると良い)
fold_leftは引数として渡さなくてもaccを含んでる
let encode = list => { let rec aux = (count, acc, list) => switch (list) { | [] => [] /* Can only be reached if original list is empty */ | [x] => [(count + 1, x), ...acc] /* 最終的にはaccを返す */ | [a, ...[b, ..._] as rest] => if (a == b) { /* countは引数として渡す */ aux(count + 1, acc, rest); } else { /* 結果はaccに詰めていく */ aux(0, [(count + 1, a), ...acc], rest); } }; List.rev(aux(0, [], list)); };