# [erlang-questions] LFE - Lisp Flavoured Erlang released

Kevin Scaldeferri kevin@REDACTED
Mon Mar 10 23:44:30 CET 2008

```On Mar 10, 2008, at 2:11 PM, Torbjorn Tornkvist wrote:

>
> Perhaps a stupid question. Do LFE implement currying?
> If not, why?
>
> I want currying... :-)
>

Here's something I threw together in a couple minutes:

%% F({a,b}) -> F'(a,b)
curry(F, Arity) ->
if
Arity =:= 1 -> fun(A)         -> F({A}) end;
Arity =:= 2 -> fun(A,B)       -> F({A,B}) end;
Arity =:= 3 -> fun(A,B,C)     -> F({A,B,C}) end;
Arity =:= 4 -> fun(A,B,C,D)   -> F({A,B,C,D}) end;
Arity =:= 5 -> fun(A,B,C,D,E) -> F({A,B,C,D,E}) end;
true -> throw(unsupported_arity)
end.

%% F(a,b) -> F'({a,b})
uncurry(F) ->
fun(Tuple) -> apply(F, tuple_to_list(Tuple)) end.

A gross hack, to be sure, although I can't see how you could have any
hope to avoid having to specify an Arity to curry().  Maybe there's a
way to implement it less horribly, though.

BTW, did you actually mean that you want partial application?  Via a
similar process:

papply(F, Arity, Arg) ->
if
Arity =:= 1 -> fun()        -> F(Arg) end;
Arity =:= 2 -> fun(A)       -> F(Arg,A) end;
Arity =:= 3 -> fun(A,B)     -> F(Arg,A,B) end;
Arity =:= 4 -> fun(A,B,C)   -> F(Arg,A,B,C) end;
Arity =:= 5 -> fun(A,B,C,D) -> F(Arg,A,B,C,D) end;
true -> throw(unsupported_arity)
end.

-kevin

```