通过映射匹配元组中的值

问题描述

我正在尝试制作这样的功能

.Date

X 应该是一个包含三个元素的元组,第一个是描述。其他值可以是整数,也可以是原子 a 或 b,或另一个元组。第二个参数应该是一个映射,它将 X 中的任何潜在原子 a 或 b 映射到一个值。示例输入可以是

eval(X,Map = #{}) ->
%% expression
. 

eval({add,a,b},#{a => 1,b => 2})
eval({add,2},#{a => 1})

我终其一生都无法找到一种方法来使用 Map,将 X 中的任何潜在原子 a 或 b 映射到输入中给定的值。任何人都有关于如何实现的建议,以便将任何原子 a 或 b 映射到 Map 中给出的值?

解决方法

正如 Map pattern matching in function head 上的其他人所建议的那样(尽管这个问题的描述要清晰得多),您正在寻找的是……

Traceback (most recent call last):
  File "DeviceServerRequester.py",line 38,in <module>
    main()
  File "DeviceServerRequester.py",line 35,in main
    r.ask()
  File "DeviceServerRequester.py",line 20,in ask
    self.sock.connect(self.address)
OSError: [Errno 9] Bad file descriptor

,

修改@BrujoBenavides 已发布的答案以处理嵌套元组:

eval({Op,a,b},#{a := A,b := B}) ->
  eval(Op,A,B);

eval({Op,B},#{a := _} = Map) when is_integer(B) ->
  eval({Op,Map#{b => B});

eval({Op,Expr},#{a := _} = Map) ->
  B = eval(Expr,Map),eval({Op,#{b := _} = Map) when is_integer(A) ->
  eval({Op,Map#{a => A});

eval({Op,Expr,#{b := _} = Map) ->
  A = eval(Expr,_) when is_integer(A),is_integer(B) ->
  eval({Op,#{a => A,b => B});

eval({Op,Expr1,Expr2},#{} = Map) ->
  %% need to evaluate Expr1 and Expr2 before Op
  A = eval(Expr1,B = eval(Expr2,Map#{a => A}),Map#{a => A,b => B}).

eval(add,B) ->
  A+B;

eval(sub,B) ->
  A - B;

eval(mul,B) ->
  A * B;

eval('div',B) ->
  A div B.