Browse thread
[Caml-list] Optional arguments and type annotations
-
Christian RINDERKNECHT
- Jacques Garrigue
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Jacques Garrigue <garrigue@k...> |
| Subject: | Re: [Caml-list] Optional arguments and type annotations |
From: Christian RINDERKNECHT <rinderkn@hugo.int-evry.fr> > I am used to annotate the top-level functions with their types, and I > was surprised to see that I must write the following to make it > type-check: > > #let bump ?(step:int option) (x:int) = > match step with > None -> x * 2 > | Some y -> x + y > ;; > val bump : ?step:int -> int -> int = <fun> > > and then there is a discrepancy between the "int option" annotation in > the .ml and the "int" in the interface. As you can see with the pattern matching, from inside the function step is of type "int option". But since it is optional, when applying the function you can simply pass an argument of type "int", which is reflected by the external type of the function. This is not to say that there is no discrepancy: actually, if you pass an argument with label ?step: instead of ~step:, it has to be of type "int option", so that we could have written "?step:int option -> int -> int". But since an optional argument must always have type "t option", the "option" part is redondant, and omitted in the printed and parsed types (it actually appears inside the type checker). Hope this is not too misleading. Jacques Garrigue ------------------- Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr