[英]How do I map a value from a map to a variable when map is passed in to a function in Erlang?
我有这样的场景:编写一个 function eval/2,它接受一个元组作为它的第一个参数,第二个参数 map 将原子映射到数字。 例如,调用 eval({add, a, b}, #{a => 1, b => 2}) 返回 3 而调用 eval({mul, {add, a, 3}, b}, # {a => 1, b => 2}) 返回 { ok, 8}2. 更一般地,eval(E, L) 接受三个元素 {Op, E1, E2} 的表达式元组 E 作为输入,其中 Op 是 add、mul、'div' 或 sub,E1 和 E2 是数字、原子或一个表达式元组,以及充当原子查找表的 Erlang map L。 function 返回 {ok, Value} 或 {error, Reason},如果查找表中不存在原子,则 Reason 为 variable_not_found 或 unknown_error。 在模块 task1 中实现 function eval/2 并导出。
例子:
1> eval({add, 1, 2}, #{}).
{ok, 3}
2> eval({add, a, b}, #{a=>1}).
{error, variable_not_found}
3> eval({add, {add, a, b}, {add, 1, 2}}, #{a=>2, b=>3}). {ok, 8}
当只发送一个元组时我解决了这个问题,但我真的不知道如何处理发送到 function 的 map。
这是我的代码:
-module(task1).
-export([eval/1, eval/2]).
eval_inner({add, X, Y}) ->
eval_inner(X) + eval_inner(Y);
eval_inner({mul, X, Y}) ->
eval_inner(X) * eval_inner(Y);
eval_inner({'div', X, Y}) ->
eval_inner(X) / eval_inner(Y);
eval_inner({sub, X, Y}) ->
eval_inner(X) - eval_inner(Y);
eval_inner(X) when is_number(X) ->
X;
eval_inner(X) when is_atom(X) ->
maps:get(X, M).
eval(X) ->
try eval_inner(X) of
V -> {ok, V}
catch
_:_ -> error
end.
eval(X, M) ->
您必须传递值 map。
-module(task1).
-export([eval/1, eval/2]).
eval_inner({add, X, Y}, M) ->
eval_inner(X, M) + eval_inner(Y, M);
eval_inner({mul, X, Y}, M) ->
eval_inner(X, M) * eval_inner(Y, M);
eval_inner({'div', X, Y}) ->
eval_inner(X, M) / eval_inner(Y, M);
eval_inner({sub, X, Y}) ->
eval_inner(X, M) - eval_inner(Y, M);
eval_inner(X, _M) when is_number(X) ->
X;
eval_inner(X, M) when is_atom(X) ->
maps:get(X, M).
eval(X, M) ->
try eval_inner(X, M) of
V -> {ok, V}
catch
_:_ -> error
end.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.