OCaml に break は必要?
OCamlってbreakがないんですよね。ということを id:ytqwerty:20080311#p1 を読んで改めて思いました。これまで私は break が欲しいと思ったことがなかったので、あまり意識したことがありませんでした。なぜ欲しいと思わなかったんでしょう?よく分かんないや。
まぁそれはさておき、Mapは良く分かんないからSetではこういう案はどうでしょう。
module CharSet = Set.Make(Char) let s = List.fold_right CharSet.add ['A'; 'B'; 'C'; 'D'; 'E'] CharSet.empty;; (* 普通にfold版 *) CharSet.fold (fun elt -> function | true -> if elt = 'C' then false else (print_char elt; true) | false -> false ) s true;; (* ローカルな例外?版 *) let _ = let module M = struct exception Break end in try CharSet.iter (function | 'C' -> raise M.Break | elt -> print_char elt ) s with M.Break -> ()
うーん、ダメなんでしょうね、きっと。というかそもそもSetはこういうのに使うべきではない(と私は信じているのですがこの思い込みもひょっとしてどうなの?)のだろうから素直にListで再帰しちゃうのが良いような気がします。Listならbreakが欲しい場面もそうそうないのではないかと思うのですが、どうなのでしょう。要るのかな?