This language bar is your friend. Select your favorite languages!
Select your favorite languages :
- Or search :
- Clojure
- Clojure
- C++
- C++
- C#
- D
- Dart
- Elixir
- Go
- Haskell
- Haskell
- JS
- JS
- Java
- Lisp
- Lua
- Lua
- PHP
- PHP
- Perl
- Python
- Ruby
- Rust
- Scala
- Scala
- Scheme
//function
auto add(int a, int b) -> int {
return a + b;
}
//curry with std::bind
using namespace std::placeholders;
auto add5 = std::bind(add, _1, 5);
//curry with lambda
auto add5 = [](int x) { return add(x, 5); };
//use
auto result = add5(1);
assert(result == 6);
You can use std::bind or a lambda to do so.
// function taking many parameters
int add(int a, int b)
{
return a + b;
}
// define a new function preseting the first parameter
std::function<int (int)> add_def(int a)
{
return [a](int b){return add(a, b);};
}
int result = add_def(4)(6);
using closure and lambda
Func<A, C> curry<A, B, C>(Func<A, B, C> f, B b) => (A a) => f(a, b);
Lambda syntax.
defmodule Curry do
def curry(fun) do
{_, arity} = :erlang.fun_info(fun, :arity)
curry(fun, arity, [])
end
def curry(fun, 0, arguments) do
apply(fun, Enum.reverse arguments)
end
def curry(fun, arity, arguments) do
fn arg -> curry(fun, arity - 1, [arg | arguments]) end
end
end
type PayFactory func(Company, *Employee, *Employee) Payroll
type CustomPayFactory func(*Employee) Payroll
func CurryPayFactory(pf PayFactory,company Company, boss *Employee) CustomPayFactory {
return func(e *Employee) Payroll {
return pf(company, boss, e)
}
}
The currying function is not generic, it must be written for each type of currying needed.
curry range
range(a,b) = [a..b]
(curry range 1) = \ i -> [1..i]
curry range :: a -> a -> [a]
curry :: ((a, b) -> c) -> a -> b -> c
"::" means "is of type"
Haskell begins with most functions already curried and allowing partial projection, hence the uncurried range sprang to mind as a notable exception for this illustration.
Data.Ix contains range
(curry range 1) = \ i -> [1..i]
curry range :: a -> a -> [a]
curry :: ((a, b) -> c) -> a -> b -> c
"::" means "is of type"
Haskell begins with most functions already curried and allowing partial projection, hence the uncurried range sprang to mind as a notable exception for this illustration.
Data.Ix contains range
function curry (fn, scope) {
scope = scope || window;
// omit curry function first arguments fn and scope
var args = Array.prototype.slice.call(arguments, 2);
return function() {
var trueArgs = args.concat(Array.prototype.slice.call(arguments, 0));
fn.apply(scope, trueArgs);
};
}
Call curry on a function, a scope and then just enumerate the arguments you want to be curried in the returned function ;)
IntBinaryOperator simpleAdd = (a, b) -> a + b;
IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b;
System.out.println(simpleAdd.applyAsInt(4, 5));
System.out.println(curriedAdd.apply(4).applyAsInt(5));
function curry2(f)
return function(a)
return function(b)
return f(a,b)
end
end
end
function add(a,b)
return a + b
end
local curryAdd = curry2(add)
local add2 = curryAdd(2)
local unpack = unpack or table.unpack
local function aux_ncurry(n, m, fn, args)
if m>n then return fn(unpack(args,1,n))end
local new_args, new_m = {}, m
for i=1,m-1 do new_args[i]=args[i]end
return function(a)
new_args[new_m]=a
return aux_ncurry(n, new_m + 1, fn, new_args)
end
end
local function ncurry(n, fn) return aux_ncurry(n,1,fn,{}) end
function curry($f, ...$argsCurried)
{
return function (...$args) use ($f, $argsCurried) {
$finalArgs = array_merge($argsCurried, $args);
return call_user_func_array($f, $finalArgs);
};
}
function add($n1, $n2)
{
return $n1 + $n2;
}
$addFive = curry('add', 5);
echo $addFive(2), PHP_EOL;
echo $addFive(-5), PHP_EOL;
curry returns an anonymous function or closure (http://php.net/manual/en/functions.anonymous.php).