完全に OCaml で書き換えた