Ocaml中参数的评估顺序

时间:2017-03-29 15:41:43

标签: function functional-programming arguments ocaml

我想知道为什么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实现   从左到右评估参数。所有相同,利用   如果将来这个实施功能可能会变得危险   该语言的版本修改了实现。   

1 个答案:

答案 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