t-nissieの日記: 【電脳】Erlangで遊んでみた 2日目 その2 リスト内包表記,foldl
[{item, quantity, price}, ...] という形式の買い物リストを考える.このとき,
[{item, subtotal}, ...] という形式の小計リストを構築するリスト内包表記を
書け.ただし,subtotalはquantity*priceである.さらにsubtotalの総和
を求めるにはどうしたらよいか.
accounting.erl(末尾再帰を使って書けるというか,foldlが末尾再帰になるというか.)
-module(accounting).
-export([sum_up/1]).
sum_up_tr([],Sum) -> Sum;
sum_up_tr([{_Product,Subtotal}|T],Sum) -> sum_up_tr(T,Sum+Subtotal).
sum_up(Subtotals) ->
sum_up_tr(Subtotals,0.0).
実行.Emacsではerlang-compile(C-cC-kにバインドされている)で編集中のファイルを
erlang-shellでコンパイルできる.
Erlang R15B02 (erts-5.9.2) [source] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9.2 (abort with ^G)
1> c("/Users/takeshi/erlang/7languages7weeks/modules/accounting", [{outdir, "/Users/takeshi/erlang/7languages7weeks/modules/"}]).
c("/Users/takeshi/erlang/7languages7weeks/modules/accounting", [{outdir, "/Users/takeshi/erlang/7languages7weeks/modules/"}]).
{ok,accounting}
2> Cart = [{pencil, 4, 0.25}, {pen, 1, 1.20}, {paper, 2, 0.20}].
[{pencil,4,0.25},{pen,1,1.2},{paper,2,0.2}]
3> Subtotals = [{Product, Quantity*Price} || {Product, Quantity, Price} <- Cart].
[{pencil,1.0},{pen,1.2},{paper,0.4}]
4> accounting:sum_up(Subtotals).
2.6
5> lists:foldl(fun({_Product,Subtotal},Sum) -> Sum+Subtotal end, 0, Subtotals).
2.6
6>
【電脳】Erlangで遊んでみた 2日目 その2 リスト内包表記,foldl More ログイン