NAME

FP::Currying

SYNOPSIS

use FP::Currying;
# see usage below

FUNCTIONS

curry(f)->(arg1)->(arg2)

Takes a function (coderef) f that takes 2 arguments, and returns a function that takes just 1 argument, which when called returns a function that takes again 1 argument and when called calls f with the two separately passed arguments.

use FP::Array 'array';

is_deeply curry(\&array)->(10)->(20),
          [ 10, 20 ];
curry_(f, args..)->(args1..)->(args2..)

Same as curry but accepts multiple arguments in each step.

is_deeply curry_(\&array, 1)->(10, 11)->(20, 21, 23),
          [ 1, 10, 11, 20, 21, 23 ];
partial(f, args...)->(args1..)

Takes a function f and fewer than the normal arguments to f, and returns a fn that takes a variable number of additional args. When called, the returned function calls f with args + additional args.

(Same as curry_ but with only one step.)

is_deeply partial(\&array, "hi", 1)->(3, 9),
          [ "hi", 1, 3, 9 ];
uncurry, uncurry_1_1, uncurry_2_1, uncurry_1_2, uncurry_2_2, uncurry_1_1_1

Sometimes it's easier to write code in a curried fashion. Often users still expect to receive an uncurried ("normal") version of the function. `uncurry_1_1 $fn` returns a function that expects 2 arguments, passes the first to $fn and then the second to the function that $fn returns. Other variants behave similarly: the appendix tells how many arguments each function level expects; the added numbers determine how many arguments the resulting function expects.

my $mult = uncurry sub { my ($x) = @_; sub { my ($y) = @_; $x*$y }};
is &$mult(2,3), 6;
# 'uncurry' is an alias to 'uncurry_1_1'.

my $mult3 = uncurry_2_1 sub { my ($x,$y) = @_; sub { my ($z) = @_; $x*$y*$z }};
is &$mult3(2,3,4), 24;

TODO

Add tail-call optimization to the last call in the chain. Waiting till Sub::Call::Tail is fixed, or better, we've got a switchable variant.

SEE ALSO

There are also various modules for currying (curry, not uncurry) on CPAN.

`the_method` and `cut_method` in FP::Ops.

NOTE

This is alpha software! Read the status section in the package README or on the website.