[erlang-questions] Calling a Function with Same argument twice

David Mercer dmercer@REDACTED
Wed Oct 14 15:52:42 CEST 2009


sapan shah wrote:

> test(X,Y) ->
>     {element(1,test(X-1,Y-1)),element(2,test(X-1,Y-1))}.
. . .
> Here, when start(1) is called, it intern calls
> {element(1, test(1,1), element(2, test(1,1)}
> 
> The first call of test(1,1) should recursively evaluate test(1,1) while
> the
> second call should already use the value returned by the first call.. Is
> this a right thinking???

No, test(X,Y) is evaluating test(X-1,Y-1) twice.  If you wanted it to only
evaluate it once, you could write:

	test(X,Y) ->
		Test = test(X-1,Y-1),
		{element(1,Test), element(2,Test)}

Even in Haskell, you would have to evaluate test(X-1,Y-1) twice, since there
are side-effects (the put call in test(0,0)), which would require it to be
wrapped in a monad.  (I'm not a Haskell expert, never having written a line
of it in my life, so feel free to correct me if my understanding of the
language is wrong.)

Cheers,

David

> -----Original Message-----
> From: erlang-questions@REDACTED [mailto:erlang-questions@REDACTED] On
> Behalf Of sapan shah
> Sent: Wednesday, October 14, 2009 8:09 AM
> To: erlang-questions
> Subject: [erlang-questions] Calling a Function with Same argument twice
> 
> Hi,
> 
> see the code below.
> %%%%%%%%%%
> -module(temp).
> -compile(export_all).
> 
> 
> start(X) ->
>     put(test, 0),
>     case X of 1 -> test(2, 2); 2-> test1(2) end,
>     get(test).
> 
> 
> test(0,0) ->
>     put(test, get(test) +1),
>     {0,0};
> 
> test(X,Y) ->
>     {element(1,test(X-1,Y-1)),element(2,test(X-1,Y-1))}.
> 
> 
> test1(0) ->
>     put(test, get(test) +1),
>     {0};
> test1(X) ->
>     {element(1,test1(X-1))}.
> %%%%%%%
> 
> We call temp:start(1), the output is 4. The output should have been 1.
> Here, when start(1) is called, it intern calls
> {element(1, test(1,1), element(2, test(1,1)}
> 
> The first call of test(1,1) should recursively evaluate test(1,1) while
> the
> second call should already use the value returned by the first call.. Is
> this a right thinking???
> --
> Regards,
> Sapan Shah



More information about the erlang-questions mailing list