A feature of certain functional programming languages such as ML. In languages such as C, pascal, Java etc. if you have a function of several arguments then you have to supply all of the arguments at once. In ML however i can do the following
fun map (f:'a->'b) (x::l) = (f x) :: (map f l)
|map _ [] =[];
This function takes a list of elements of type 'a and a function that takes an argument of type 'a and returns a value of type 'b, as arguments and returns the list obtained by applying f to all the elements of the list. The
ML type of this function is fn : ('a -> 'b) -> 'a list -> 'b list.
An equivalent function could easily be written in C, using function pointers, although the list would have to be of type void * in order to mimic the polymorphism we have in ML.
But what you can do in ML that you can't do in traditional languages is something like this :
val Mymap = map f;
where f is a function already defined.
We have applied the function map partially to f. Mymap is a new function that takes a list as a
parameter and applies f to all the elements of the list. Mymap is not just an
alias or a
macro for map f : if you change map or f, Mymap will not be changed. You can even do something like
val mymap2= map (map f)
which is a function that takes a list of lists of items type 'a and returns a list of lists of items obtained by applying f.
A more down to earth example is as follows:
fun derivative f (delta:real) x = ((f (x+delta))-(f (x-delta)))/(2.0*delta);
As you can see, this function calculates the
derivative of f at the
point x by calculating the
slope between x-delta and x+delta. Still nothing I can't do in
C. But in
ML I can do this :
val derivativeOfF = derivative f .001;
like before derivativeOfF is a
new function that is an approximation of the derivative of f
In the end, it's a pretty cool feature that like many of the elements of languages like ML helps you to write concise and elegant code.