[erlang-questions] Automatic currying

Pierre Fenoll pierrefenoll@REDACTED
Fri May 1 01:45:30 CEST 2015


I'd like to have a shorthand syntax:

1> Print = fun io:format("lookee here: ~p\n")/1.
#Fun<function.0.2345234>
2> Print([ stuff ]).
lookee here: stuff
ok
3>

Print would actually be sugar for
Print = fun (X) -> io:format("lookee here: ~p\n", X) end.
with all the rules concerning funs applying in the same way.


Cheers,
-- 
Pierre Fenoll


On 30 April 2015 at 13:42, Siraaj Khandkar <siraaj@REDACTED> wrote:

> One of the things I often wish for, when using Erlang, is staged
> application of any function without having to manually wrap it in stage
> funs (which you get in languages that feature curried-by-default functions).
>
> The other day it occurred to me that the ability to get fun arity info and
> to apply arguments as a list was all that was needed to get very, very
> close to the behavior I wanted. Voila:
>
>     -module(function).
>     -export([curry/1]).
>
>     curry(F) ->
>         Info = erlang:fun_info(F),
>         {value, {arity, Arity}} = lists:keysearch(arity, 1, Info),
>         curry(F, [], Arity).
>
>     curry(F, Args, 0) ->
>         apply(F, lists:reverse(Args));
>     curry(F, Args, Arity) ->
>         fun (X) -> curry(F, [X | Args], Arity - 1) end.
>
> In action:
>
>     $ erl
>     1>
>     1> Nums = lists:seq(1, 10).
>     [1,2,3,4,5,6,7,8,9,10]
>     2>
>     2> Plus = function:curry(fun (X, Y) -> X + Y end).
>     #Fun<function.0.4634292>
>     3>
>     3> lists:map(Plus(1), Nums).
>     [2,3,4,5,6,7,8,9,10,11]
>     4>
>     4> lists:map(Plus(3), Nums).
>     [4,5,6,7,8,9,10,11,12,13]
>     5>
>     5> lists:map(Plus(5), Nums).
>     [6,7,8,9,10,11,12,13,14,15]
>     6>
>     6> Fold = function:curry(fun lists:foldl/3).
>     #Fun<function.0.4634292>
>     7>
>     7> AddTo = Fold(fun (X, Y) -> X + Y end).
>     #Fun<function.0.4634292>
>     8>
>     8> AddTo0 = AddTo(0).
>     #Fun<function.0.4634292>
>     9>
>     9> AddTo100 = AddTo(100).
>     #Fun<function.0.4634292>
>     10>
>     10> AddTo0(Nums).
>     55
>     11> AddTo100(Nums).
>     155
>     12>
>     12> AddTo100(lists:seq(4, 78)).
>     3175
>     13>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150430/fcee0d15/attachment.htm>


More information about the erlang-questions mailing list