【发布时间】:2015-01-07 09:26:36
【问题描述】:
我对 Erlang 语言的了解越来越多,最近遇到了一些问题。我读到了foldl(Fun, Acc0, List) -> Acc1 函数。我使用了 learnyousomeerlang.com 教程,并且有一个示例(示例是关于 Erlang 中的逆波兰符号计算器):
%function that deletes all whitspaces and also execute
rpn(L) when is_list(L) ->
[Res] = lists:foldl(fun rpn/2, [], string:tokens(L," ")),
Res.
%function that converts string to integer or floating poitn value
read(N) ->
case string:to_float(N) of
%returning {error, no_float} where there is no float avaiable
{error,no_float} -> list_to_integer(N);
{F,_} -> F
end.
%rpn managing all actions
rpn("+",[N1,N2|S]) -> [N2+N1|S];
rpn("-", [N1,N2|S]) -> [N2-N1|S];
rpn("*", [N1,N2|S]) -> [N2*N1|S];
rpn("/", [N1,N2|S]) -> [N2/N1|S];
rpn("^", [N1,N2|S]) -> [math:pow(N2,N1)|S];
rpn("ln", [N|S]) -> [math:log(N)|S];
rpn("log10", [N|S]) -> [math:log10(N)|S];
rpn(X, Stack) -> [read(X) | Stack].
据我了解,lists:foldl 对列表中的每个元素执行 rpn/2。但据我所知,这是这个功能。我阅读了文档,但对我没有多大帮助。有人可以解释一下lists:foldl 的工作原理吗?
【问题讨论】:
-
这个问题确实比 Erlang 更笼统,并且触及了不熟悉函数式范式的程序员的常见绊脚石。阅读这个特定示例的便利性让我想知道如果以更一般的方式重新表述这个问题是否会对更多人有用。
标签: recursion functional-programming erlang tail-recursion fold