This site is updated infrequently. For up-to-date information, please visit the new OCaml website at ocaml.org.

Re: curried fns
• fauque@e...
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
 Date: -- (:) From: fauque@e... Subject: Re: curried fns
```

I am not a caml expert and the gurus will say if I am wrong, but this
is what I understand:

> Could someone please explain the difference(s) between:
>
>	let f x = function y -> y + x;;
>
> and
>
>	let f x y = y + x;;

there is absolutely no differences between these two expressions: y+x will
be evaluated only when two arguments x and y are given to f.

> Both have the same type (int -> int -> int) but they seem to behave
> distinctly wrt evaluation strategy.
>
> For instance, if i use the 1st form and write:
>
> 	let h x = let z = fact x in fun y -> y + z;;
> 	map (h 30) [1;2;3];; (* note 1 *)
>
> fact 30 gets evaluated only once (partial evaluation), while
> the use of the 2nd form for the h function:
>
> 	let h x y = let z = fact x in y + z;;
> 	map (h 30) [1;2;3];;
>
> causes fact 30 to be evaluated _for each_ element of the list.

this is not the same case: the first form should have been:

let h x = fun y -> let z = fact x in y + z;;

and here fact 30 will be evaluated for each element of the list;
you have done in fact an optimization by putting the fact x before
the fun y ->   and it lets caml compute the fact x without the need
to know the actual value of y.

Hubert Fauque
hubert.fauque@enst-bretagne.fr

```