[erlang-questions] Re: Concept of Side-effect

Jayson Vantuyl kagato@REDACTED
Fri Sep 18 03:35:01 CEST 2009


I'll do better.  Here's an example that actually is necessary.

Assume you have two processes.  One updates a record in Mnesia, the  
other receives an acknowledgement that it did it.

Mnesia can replay a transaction in times of extreme contention.   
Here's a buggy version of a function that charges some account.  Look  
at the fun() inside.  It has the side-effect that it sends a message  
to another process.

> charge_account(Requestor,UserId,Amount) ->
>   {atomic,ok} = mnesia:transaction(
>     fun() ->
>       [ Current ] = mnesia:read(account,UserId),
>       OldAmount = Current#account.amount,
>       New = Current#account{ amount = OldAmount - Amount },
>       ok = mnesia:write(New),
>       Requestor ! {updated,New},
>       ok
>     end
>   ).

This function will potentially send the message to Requestor multiple  
times if the transaction has to be retried.

If you want to do this correctly, you can simply modify the function  
like this:

> charge_account(Requestor,UserId,Amount) ->
>   {atomic,Result} = mnesia:transaction(
>     fun() ->
>       [ Current ] = mnesia:read(account,UserId),
>       OldAmount = Current#account.amount,
>       New = Current#account{ amount = OldAmount - Amount },
>       ok = mnesia:write(New),
>       New
>     end,
>     Requestor ! {updated,Result},
>   ).

The inner fun() has no side-effects and can now be safely retried by  
Mnesia.

This is only one instance where side-effects matter.  The important  
thing to remember is that state data in Erlang takes the form of  
recursion, processes and messages.  If you don't create recurse with a  
modified value, create a process, or send a message, then no state is  
changed.  Even when you recurse, your state only affects a single  
process.  This property makes it very easy to create very stable  
programs, because you can contain the places that state can get  
corrupted or lost.

Hopefully this helps.

On Sep 17, 2009, at 6:17 PM, Kaiduan Xie wrote:

> Thanks all for the reply. Can someone provide an example in code? For
> example, a side-effect free function, and its counterpart function
> with side-effect.
>
> Thanks,
>
> kaiduan
>
> On Thu, Sep 17, 2009 at 11:07 AM, Gene Tani <gene.tani@REDACTED>  
> wrote:
>>
>>
>> On Sep 16, 3:26 pm, Kaiduan Xie <kaidu...@REDACTED> wrote:
>>> Hi,
>>>
>>> Can someone explain what does side-effect means in Erlang? What is
>>> side-effect free function, and why we need to write side-effect free
>>> function? A concrete example is preferred.
>>>
>>> Thanks,
>>>
>>> kaiduan
>>>
>>> ________________________________________________________________
>>> erlang-questions mailing list. Seehttp://www.erlang.org/faq.html
>>> erlang-questions (at) erlang.org
>>
>> http://blog.tornkvist.org/blog.yaws?id=1239107937892262
>>
>> http://www.cs.chalmers.se/Cs/Grundutb/Kurser/ppxt/HT2007/general/languages/armstrong-erlang_history.pdf
>> (PDF page 14)
>>
>> and a FP vs. OO debate:
>>
>> http://news.ycombinator.com/item?id=493963
>>
>> ________________________________________________________________
>> erlang-questions mailing list. See http://www.erlang.org/faq.html
>> erlang-questions (at) erlang.org
>>
>>
>
> ________________________________________________________________
> erlang-questions mailing list. See http://www.erlang.org/faq.html
> erlang-questions (at) erlang.org
>



-- 
Jayson Vantuyl
kagato@REDACTED





More information about the erlang-questions mailing list