院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

順列 reasonml

let add_to_each = (num, lst) => List.map(el => [num, ...el], lst);

let rm = (x, l) => List.filter((!=)(x), l);

/* 目的:与えられたリストの順列を求める */
/* permutations2: list(int) => list(list(int))  */
let rec permutations2 = lst =>
  switch (lst) {
  | [] => []
  | [x] => [[x]] /* 要素が一つで下行くと空になっちゃうから再帰が終わらないから*/
  | _ =>
    List.fold_left(
      (acc, cur) => acc @ add_to_each(cur, permutations2(rm(cur, lst))),
      [],
      lst,
    )
  };

う~む、ググったのを参考に作ったけど、自分で作れないなー。
作りかけの関数ができてると仮定して作っていくのは面白いんだけど、本当に出来てるのかどうかを考えるところで頭がごっちゃになる。

その他
forEachの結果をまとめて返したいときにもreduceが使える。

追記
いや、そんなに難しくないぞー
もう少し考えれば作れそう