繁体   English   中英

当 map 传递给 Erlang 中的 function 时,如何将 map 中的值从 map 传递到变量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM