Discussion:
Function Application is not Currying
(too old to reply)
Xah Lee
2009-01-28 21:32:29 UTC
Permalink
Function Application is not Currying

Xah Lee, 2009-01-28

In Jon Harrop's book Ocaml for Scientist at
http://www.ffconsultancy.com/products/ocaml_for_scientists/chapter1.html

It says:

Currying

A curried function is a function which returns a function as its
result.

LOL. That is incorrect.

Here are some examples of a function that returns a function as
result, but is not currying.

Mathematica example:

f[n_]:=Function[n^#];
f[7][2]
(* returns 49 *)

Emacs lisp example:

(defmacro f (n) (list 'lambda (list 'x) (list 'expt n 'x) ) )
(funcall (f 7) 2)

Perl example:

sub f {$n=$_[0]; sub { $n ** $_[0]} };
print &{ f(7) } (2);

Javascript example:

function f(n) {return function (x) {return Math.pow(x,n);}; }
alert (f(7) (2));

In the above, a function returns a function, and the result function
is applied to a value. They demonstrate 2 things:

* The ability of the lang to have a function that returns a
function.
* The ability to apply a value (of type function) to a value.

These, are 2 of the features that is part of often sloppily termed as
“function as first class citizens”.

However, the above are not languages that support currying, which is a
feature that Haskell & Ocaml has.

So what is Currying?

Wikipedia article Currying said it best:

In computer science, currying, invented by Moses Schönfinkel and
Gottlob Frege, and independently by Haskell Curry,[1] is the technique
of transforming a function that takes multiple arguments (or more
accurately an n-tuple as argument) in such a way that it can be called
as a chain of functions each with a single argument.

Note how it says “is the technique of ...”.

To be more concrete, in the context of a given computer language, to
say that it support curring, is to mean that the compiler understand
the concept to certain degree. More to the point, the language is
inherently able to take a function of more than one arg and
deconstruct it to several functions of single arg.

To say that function returning function is Currying, is a confusion of
fundamental concepts.

Mathematically, currying is the concept of deconstructing a function
of multiple parameters to a composition of several functions all of
arity 1.

I like Jon, because i consider majority of his argument and
perspective are more correct or sensible in his trollish spats in
newsgroup fighting with tech geekers. But he is really a asshole, and
take every chance to peddle his book. Every mother fucking
opponitunity, he injects random opinion into discussions about how
static typing or greatness of Microsoft, which paves a way for him to
post a link to his book on Ocaml/F# or “study” or “speed comparison”
of his site. He does this repeatedly and intentionally, about every
week for the past 2 or so years, and write in a way to provoke irate
responses. In the past 2 or 3 years, i have for 2 or so times without
his or anyone's solicitation, publically supported him in ugly
newsgroup fights (such as some serious sounding post that accuse him
of spamming or or some real life threats about network abuse).
However, in the past year as i have had some debates on language
issues with jon, i find Jon to be a complete asshole as far as his
newsgroup demeanor goes.

PS see also: A Mathematica Optimization Problem ( story of a thread
where Jon started a fight with me )

Perm url for this post:
• Function Application is not Currying
http://xahlee.org/UnixResource_dir/writ/apply_func_examples.html

Xah
∑ http://xahlee.org/


s***@netherlands.com
2009-01-28 23:17:13 UTC
Permalink
Post by Xah Lee
Function Application is not Currying
Xah Lee, 2009-01-28
In Jon Harrop's book Ocaml for Scientist at
http://www.ffconsultancy.com/products/ocaml_for_scientists/chapter1.html
Currying
A curried function is a function which returns a function as its
result.
Curry, is that like chicken soup or some Indian mash?

Why ? How about returning an index number into an array of function pointers
as handlers from packet data?

Oh, thats network communications.

sln
alex23
2009-01-29 00:28:22 UTC
Permalink
Post by Xah Lee
But he is really a asshole, and
take every chance to peddle his book.
As opposed to really being an asshole and peddling one's website at
every opportunity?
Kaz Kylheku
2009-01-29 01:49:25 UTC
Permalink
Post by Xah Lee
Function Application is not Currying
That's correct, Xah. Currying is a special case of function application.
A currying function is applied to some other function, and returns function
that has fewer arguments.

In some languages, you don't see the currying function. It's invisibly
performed whenever you forget an argument. Hit a three argument function with
only two arguments, and you don't get a nice ``insufficient arguments in
function call'' error, but the call is diverted to the currying function, which
gives you back a function of one argument, which you can then call with the
missing argument to compute the original function.
Post by Xah Lee
Xah Lee, 2009-01-28
In Jon Harrop's book Ocaml for Scientist at
http://www.ffconsultancy.com/products/ocaml_for_scientists/chapter1.html
Figures you'd be reading this. Learning anything?
Post by Xah Lee
Currying
A curried function is a function which returns a function as its
result.
LOL. That is incorrect.
Yawn. Say it isn't so.
Russ P.
2009-01-29 03:14:02 UTC
Permalink
Post by Xah Lee
Function Application is not Currying
Xah Lee, 2009-01-28
In Jon Harrop's book Ocaml for Scientist athttp://www.ffconsultancy.com/products/ocaml_for_scientists/chapter1.html
    Currying
    A curried function is a function which returns a function as its
result.
LOL. That is incorrect.
What does that have to do with the price of bananas in Costa Rica?
Jon Harrop
2009-01-30 19:12:49 UTC
Permalink
I had hoped someone else would correct you but they haven't. So...
Post by Xah Lee
Here are some examples of a function that returns a function as
result, but is not currying.
f[n_]:=Function[n^#];
f[7][2]
(* returns 49 *)
(defmacro f (n) (list 'lambda (list 'x) (list 'expt n 'x) ) )
(funcall (f 7) 2)
sub f {$n=$_[0]; sub { $n ** $_[0]} };
print &{ f(7) } (2);
function f(n) {return function (x) {return Math.pow(x,n);}; }
alert (f(7) (2));
However, the above are not languages that support currying,
That is incorrect. Mathematica, Lisp, Perl and Javascript all support
currying.
Post by Xah Lee
which is a feature that Haskell & Ocaml has.
That is correct. Here is an OCaml equivalent:

let f =
fun n ->
fun m ->
n ** m
Post by Xah Lee
To be more concrete, in the context of a given computer language, to
say that it support curring, is to mean that the compiler understand
the concept to certain degree. More to the point, the language is
inherently able to take a function of more than one arg and
deconstruct it to several functions of single arg.
That is incorrect. You only need a language with first-class functions.

I believe you are confusing the syntactic support in OCaml and Haskell for
something more. It simply allows you to rewrite the above as:

let f n m = n ** m

or:

let f = fun n m -> n ** n
--
Dr Jon D Harrop, Flying Frog Consultancy Ltd.
http://www.ffconsultancy.com/?u
Jürgen Exner
2009-01-31 00:01:50 UTC
Permalink
Post by Jon Harrop
I had hoped someone else would correct you but they haven't. So...
That is because ...
... everyone with more than 5 cents of brain has killfiled him a long
time ago.

jue

Continue reading on narkive:
Loading...