簡體   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