我有一个错误,我不明白为什么。 所以,如果我进入:模拟基本错误,Erlang
proj:calc([{push,{num,2}},{push,{num,3}},{plus},{push,{num,4}},{mul}]).
虽然代码:
calc(List) ->
[Res] = lists:foldl(fun calc/2, [], List),
Res.
calc({plus}, [N1, N2 | Stack]) -> [N1 + N2 | Stack];
calc({mul}, [N1, N2 | Stack]) -> [N1 * N2 | Stack];
calc({push,{num,X}}, Stack) -> [X | Stack].
我得到的20的输出(完美的我想要的东西,)。
但是,如果我有一个这样的输入:
proj:calc([{push,{num,2}},{push,{num,3}},{plus},{pop},{ret},{push,{num,4}},{mul},{pop},{ret}]).
虽然代码:
calc(List) ->
[Res] = lists:foldl(fun calc/2, [], List),
Res.
calc({plus},{pop},{ret}, [N1, N2 | Stack]) -> [N1 + N2 | Stack];
calc({mul},{pop},{ret}, [N1, N2 | Stack]) -> [N1 * N2 | Stack];
calc({push,{num,X}}, Stack) -> [X | Stack].
我得到一个错误:
exception error: no function clause matching proj:calc({pop},[5])
我是新来的二郎,那么为什么会发生这种情况,我该如何解决?
谢谢,我知道这不会工作,当我尝试了一切。我也试图使用过滤器,但我不知道如何正确实施它,否则它就无法工作。 – nothingness 2015-02-23 23:01:59
过滤器根据测试的结果过滤掉所有内容,并保留列表的其余部分。地图通过对列表的每个成员应用一个操作来转换列表。你所要做的就是将列表中的所有值压缩到一个值中,这就是折叠所做的事情:它将所有元素最后折叠成一个值(一个集合操作)。它恰好可以将堆栈机器的每一个动作定义为一个单一的功能,并且由于折叠已经根据它们的性质进行了“弹出,操作,推送,迭代”步骤,所以很容易用折叠来构建堆栈机器。 – zxq9 2015-02-23 23:26:54
晶莹剔透,并得到程序工作。 ty :) – nothingness 2015-02-23 23:48:40