(************************************************************ not_permitted_in_right.ml Created : Sun Jun 8 10:54:47 2003 Last modified: Mon Jun 09 10:21:05 2003 Compile: ocamlopt.opt not_permitted_in_right.ml -o not_permitted_in_right # FTP Directory: sources/ocaml # ************************************************************) (** @author Takashi Masuyama 例えば、 type expression = Var of string | List of expression list let rec print_expression_list = List.iter print_expression and print_expression = function Var s -> print_endline s | List el -> print_expression_list el で print_expression_list の定義はこれでは駄目といわれる This kind of expression is not allowed as right-hand side of `let rec' # let rec x = x;; Characters 12-13: let rec x = x;; ^ This kind of expression is not allowed as right-hand side of `let rec' は妥当だと思うけど。これと同じ問題なのかな? # let rec print_expression_list l = List.iter print_expression l and print_expression = function Var s -> print_endline s | List el -> print_expression_list el;; これだとちゃんと定義できる。む、もしや = の左に print_expression_list しかないのが いけなかったのかな?? あとでみてみよう。 let rec x = List [x] はOKである。(等号の右がコンストラクタでガードされているかららしい) このxは巡回構造をもっている。 let rec fib = fun n -> if n = 0 || n = 1 then 1 else ((fib (n-2)) + (fib (n - 1)));; はOK。 *) module StringSet = Set.Make(String) let _ = (* This kind of expression is not allowed as right-hand side of `let rec' *) (* let rec fold = List.fold_right StringSet.add in*) let fold = List.fold_right StringSet.add in let fold2 l = List.fold_right StringSet.add l in StringSet.iter print_endline (fold ["hoge"; "moge"] StringSet.empty)