# Y-combinator in Erlang

Joe Armstrong <>
Wed Jan 8 12:31:04 CET 2003

```I *strongly* object - the average joe would *not* use the Y combinator
but write factorial thus:

> Fac  = fun(0, F) -> 1;
(N, F) -> N * F(N-1, F) end.

#Fun<erl_eval.11.1870983>

This is because the above form looks pretty much like factorial as God
intended it to be written.

It is called thus:

> Fac(6, Fac).
720

/Joe

Now  how the  average  Håkan might  have  written it  is a  entirely
different matter :-)

On Tue, 7 Jan 2003, Hakan Millroth wrote:

> Now you see why I used to argue that introducing funs etc into Erlang
> would make life tougher for the average joe :-)
>
> -- Hakan
>
> On Tuesday, January 7, 2003, at 06:41  PM, Vladimir Sekissov wrote:
>
> > Good day,
> >
> > I've surprisingly found Y-combinator very useful to solve practical
> > problem of writing recursive anonymous functions in Erlang.
> >
> > Code were translated to Erlang from
> > http://www.ece.uc.edu/~franco/C511/html/Scheme/ycomb.html.
> >
> >
> > -module(lambda).
> >
> > -export([y/1, mk_fact/0]).
> >
> > %% Y-combinator itself
> > y(X) ->
> >   F = fun (P) -> X(fun (Arg) -> (P(P))(Arg) end) end,
> >   F(F).
> >
> > %% Factorial example
> > mk_fact() ->
> >   F =
> >     fun (FA) ->
> > 	fun (N) ->
> > 	    if (N == 0) -> 1;
> > 	       true -> N * FA(N-1)
> > 	    end
> > 	end
> >     end,
> >   y(F).
> >
> >
> > From shell:
> >
> > 1> F = mk_fact().
> > #Fun<lambda.3.115879927>
> >
> > 2> F(5).
> > 120
> >
> > Best Regards,