[erlang-questions] Feedback for my first non-trivial Erlang program
Aaron J. Seigo
Tue Dec 15 22:57:42 CET 2015
On Tuesday, December 15, 2015 01.45:26 Paul Wolf wrote:
> caBalance(T) -> caBalance(T-1) + salary(T-1) - expenses(T-1) -
this is going to create a stack of T calls to caBalance (let alone all the
others) as it is not tail recursive.
by using an accumulator to build our result, the VM will be able to clear the
call stack each time:
caBalance(T) when is_integer(T) -> caBalance(T, 0).
caBalance(0, Total) -> Total;
caBalance(T, Total) ->
caBlance(T - 1, Total + salary(T-1) - expenses(T-1) - tradingFees(T-1)).
or you could use a sequence and a fold:
caBalance(T) when is_integer(T) ->
lists:foldl(fun(Month, Acc) ->
salary(Month) + expenses(Month) + tradingFees(Month) + Acc end,
0, lists:seq(1, T)).
there are a number of functions in your code that suffer from this, including
on another note, as I've gotten more comfortable w/Erlang, I've found myself
using case less and less and doing things like this:
trading_fees(T) -> trading_fees_when_working(T, working(T)).
trading_fees_when_working(T, true) ->
investments(T) + transactionFee();
trading_fees_when_working(T, false) ->
trading_fees_when_working(T, true) + tax(expenses(T),T).
I find it easier to read such code as it expands and gets more complex, and in
this case it makes it more evident that when working(T) == false, it is
actually the same as when working but with taxes. readability ftw. but maybe
that's just me :)
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 198 bytes
Desc: This is a digitally signed message part.
More information about the erlang-questions