Currying in FC++

If you're unfamiliar with the term "currying", you may want to check out currying-tutorial.txt

Given a function f of three arguments, whose type is described as

   f  ::  (X,Y,Z) -> R
the following table shows some of the different ways that f can be used. Each row of the table shows different ways to express the same thing, using the various currying styles available in FC++. Note that the "prefix" and "underscore" styles can only be used on Curryables, whereas the "binder" and "curry" styles can be used on any functoid.

Prefix
(Curryables)
Underscore
(Curryables)
Binder
(all functoids)
Curry
(all functoids)
Result Type
f(x) f(x,_,_) bind1of3(f,x) curry3(f,x) (Y,Z)->R
  f(_,_,z) bind3of3(f,z)   (X,Y)->R
f(x,y) f(x,y,_) bind1and2of3(f,x,y) curry3(f,x,y) (Z)->R
  f(_,y,z) bind2and3of3(f,y,z)   (X)->R
    bind1and2and3of3(f,x,y,z) curry3(f,x,y,z) ()->R
f(x,y,z) f(x,y,z)     R

The practical offshoot of this is that it's easy to express some simple functions:

   plus(3)           // f(x) = 3 + x
   greater(_,10)     // f(x) = x > 10
   map(inc)          // a function which inc's all elements of a list
   until(prime,inc)  // f(x) = first prime number that's >= x


Last updated on July 26, 2001 by Brian McNamara