Mixin

とりあえず,mapとかを定義したSetが欲しいという話は,

module HyperSet(S:Set.S) = 
  struct
    include S
    let from_list = List.fold_left (fun s e -> S.add e s) S.empty
    let map f s = StringSet.fold (fun e s -> S.add (f e) s) s S.empty
  end

module StringSet = HyperSet(Set.Make(String))
(StringSet.map (fun x -> x^x) (StringSet.from_list ["hoge"; "huga"]))
  ==>> {"hogehoge" "hugahuga"}

とすればいいことがわかった.

まあ,いま一つかっこよくない気はするが,とりあえず目的は果たせたので,今日のところはこの辺にしといてやろう(偉そう).


っていうか,まだ全然OCamlわかってないなあ・・・orz