我想知道为什么ocaml从右到左评估调用,这是一个FP原则还是对FP语言根本不重要?
快速举例:
@event = Event.find(params[:id])
cal = Icalendar::Calendar.new
# filename = "Event #{@event.name}"
filename = @event.name
if params[:format] == 'vcs'
cal.prodid = '-//Microsoft Corporation//Outlook MIMEDIR//EN'
cal.version = '1.0'
filename += '.vcs'
else # ical
cal.prodid = '-//Acme Widgets, Inc.//NONSGML ExportToCalendar//EN'
cal.version = '2.0'
filename += '.ics'
end
cal.event do |e|
e.dtstart = Icalendar::Values::DateTime.new(@event.start_date)
e.dtend = Icalendar::Values::DateTime.new(@event.end_date)
e.summary = @event.name
e.description = @event.description
end
# text/x-vCalendar
send_data cal.to_ical, type: 'text/calendar', disposition: 'attachment', filename: filename
在我的示例中,首先评估对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)
编辑:
来自https://caml.inria.fr/pub/docs/oreilly-book/html/book-ora029.html的
在Objective CAML中,参数的评估顺序不是 指定。碰巧,今天所有的Objective CAML实现 从左到右评估参数。所有相同,利用 如果将来这个实施功能可能会变得危险 该语言的版本修改了实现。
答案 0 :(得分:6)
在OCaml中没有指定函数参数的评估顺序。
Section 6.7 of the manual中记录了这一点。
本质上,这为系统(编译器或解释器)提供了最大的自由度,以便以某种方式有利的顺序计算表达式。这意味着您(作为OCaml程序员)必须编写不依赖于评估顺序的代码。
如果您的代码纯粹是功能性的,则其行为不能依赖于顺序。因此,只有在编写带效果的代码时才需要小心。
<强>更新强>
如果您关心订单,请使用let
:
let a = <expr1> in
let b = <expr2> in
f a b
或者,更一般地说:
let f = <expr0> in
let a = <expr1> in
let b = <expr2> in
f a b
更新2
对于它的价值,你上面引用的那本书是在2002年出版的。从那时起,很多都发生了变化,包括语言的名称。更新的资源是Real World OCaml。