 <p>Consider the same functions in a module (lets not think of shell right now)</p> <pre><code>-module(fun_test). -export([test/0]). test() -&gt; F1 = fun() -&gt; timer:sleep(1000) end, F2 = fun() -&gt; io:format("hello world~n", []) end, {F1,F2}. </code></pre> <p>Output is as follows</p> <pre><code>1&gt; fun_test:test(). {#Fun&lt;fun_test.0.78536365&gt;,#Fun&lt;fun_test.1.78536365&gt;} </code></pre> <p>In the above example the anonymous function objects F1 and F2 names are constructed using the name of the module fun_test, unique identifier 0 and 1 (incremental for each function in the module), return addresses etc. as defined in the <a href="http://erlang.org/doc/apps/erts/crash_dump.html#id79001" rel="nofollow">ERTS Manual</a>. This explains the paragraph mentioned in the manual. Though not very useful, the function numbering is handy during debugging as <code>-test/0-fun-1-</code> in the trace will tell you that anonymous function 1 in test/0 function is the source of the error. </p> <p>For the functions defined in the shell use erl_eval module as explained by rvirding. The result of function object declaration is the return of erl_eval for that arity. So always the same value is returned for that arity.</p>