On 2011/08/26, at 18:20, Dmitry Bely wrote: > On Wed, Aug 24, 2011 at 7:01 PM, Philippe Veber > <[email protected]> wrote: > >>> The following fragment compiles without a warning but produces strange >>> results: >>> >>> let f ?(p1="p1") ~p2 p3 = >>> Printf.printf "p1=%s, p2=%s, p3=%s\n" p1 p2 p3 >>> >>> let _ = >>> f "p2" "p3"; (* 1 *) >>> let f2 = f "p2" in >>> f2 "p3" (* 2 *) > > (...) > >> This first application also applies optional arguments situated before the >> anoymous argument, so it remains the second (labeled) argument only. >> >> There is indeed a special case where you can drop labels if you provide the >> exact number of arguments. This means that f "p2" "p3" is equivalent to f >> ~p2:"p2" "p3". This is written in the manual >> (http://caml.inria.fr/pub/docs/manual-ocaml/manual006.html) : >> >> "As an exception to the above parameter matching rules, if an application is >> total, labels may be omitted. In practice, most applications are total, so >> that labels can be omitted in applications. " >> >> So this is actually the intended behavior, AFAIU > > Indeed. Thanks for the detailed explanation. But shouldn't the > compiler decide that the partial application skipping labeled > parameter is suspicious and generate a warning?
The golden rule here is no ambiguity. Since this function accepts only two non-optional arguments (as the return type is unit), if you pass them all at once without labels then this is accepted as a valid full application, and cannot be confused with another interpretation. Note that if you don't like this behaviour, you can manually activate warning 6 (Label omitted in function application) which requires you to write all labels. Jacques Garrigue -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs
