我希望了解为什么OCaml会从右到左评估调用,这是FP原则吗?或者对于FP语言来说根本不重要?
快速排序示例:
在我的例子中,首先评估的是对
快速排序示例:
let rec qs = function
| [] -> []
| h::t -> let l, r = List.partition ((>) h) t in
List.iter (fun e -> print_int e; print_char ' ') l; Printf.printf " <<%d>> " h;
List.iter (fun e -> print_int e; print_char ' ') r; print_char '\n';
(qs l)@(h::qs r)
在我的例子中,首先评估的是对
(qs r)
的调用,然后是对 (qs l)
的调用,但我期望它们的顺序是相反的。# qs [5;43;1;10;2];;
1 2 <<5>> 43 10
10 <<43>>
<<10>>
<<1>> 2
<<2>>
- : int list = [1; 2; 5; 10; 43]
编辑:
来自https://caml.inria.fr/pub/docs/oreilly-book/html/book-ora029.html
在Objective CAML中,参数的求值顺序未指定。目前,所有Objective CAML的实现都按照从左到右的顺序对参数进行求值。但是,如果将来的语言版本修改了实现,利用这个实现特性可能会变得危险。