ональных извращений заказывали?
Sep. 6th, 2011 08:25 pmkomar справедливо заметил некоторое различие в способах вызова окамловских List.fold_{left,right}. Мне тоже это не нравится. Попробуем это решить с максимальным количеством ональных извращений. Ну, чисто на всякий случай. Проверить свою силу, так сказать. Конечно, я -- сугубо против такого кода, сообщу сразу, в качестве дисклизмера. Несмотря на это, буду лелеять своего внутреннего индуса на специально отведённой территории.
$ ocaml
Objective Caml version 3.12.1+rc1
# #use "topfind";;
- : unit = ()
Findlib has been successfully loaded. Additional directives:
#require "package";; to load a package
#list;; to list the available packages
#camlp4o;; to load camlp4 (standard syntax)
#camlp4r;; to load camlp4 (revised syntax)
#predicates "p,q,...";; to set these predicates
Topfind.reset();; to force that packages will be reloaded
#thread;; to enable threads
- : unit = ()
# #camlp4r;;
/home/gds/dev/ovm/ocaml/lib/dynlink.cma: loaded
/home/gds/dev/ovm/ocaml/lib/camlp4: added to search path
/home/gds/dev/ovm/ocaml/lib/camlp4/camlp4r.cma: loaded
Camlp4 Parsing version 3.12.1+rc1
# open List;
# fold_left;
- : ('a -> 'b -> 'a) -> 'a -> list 'b -> 'a = <fun>
# fold_right;
- : ('a -> 'b -> 'b) -> list 'a -> 'b -> 'b = <fun>
# value flip_2_3_of_3 f = fun x y z -> f x z y;
value flip_2_3_of_3 : ('a -> 'b -> 'c -> 'd)
-> 'a -> 'c -> 'b -> 'd = <fun>
# value map_1_of_3 m f = fun x y z -> f (m x) y z;
value map_1_of_3 :
('a -> 'b) -> ('b -> 'c -> 'd -> 'e)
-> 'a -> 'c -> 'd -> 'e = <fun>
# value ( |> ) x f = f x;
value ( |> ) : 'a -> ('a -> 'b) -> 'b = <fun>
# value flip_1_2_of_2 f = fun x y -> f y x;
value flip_1_2_of_2 : ('a -> 'b -> 'c)
-> 'b -> 'a -> 'c = <fun>
# value r2l fold_right =
fold_right
|> flip_2_3_of_3
|> (map_1_of_3 flip_1_2_of_2);
value r2l :
(('a -> 'b -> 'c) -> 'd -> 'e -> 'f)
-> ('b -> 'a -> 'c) -> 'e -> 'd -> 'f =
<fun>
# value do_with_foldl foldl =
Printf.printf "res=%s\n%!"
(foldl
(fun acc s -> acc ^ s)
">"
["a";"b";"c"]
);
value do_with_foldl :
((string -> string -> string)
-> string -> list string -> string)
-> unit =
<fun>
# do_with_foldl fold_left; res=>abc - : unit = () # do_with_foldl (r2l fold_right); res=>cba - : unit = () #