Erlang,为什么我的模式匹配不适用于方程内的方程?

ned*_*wed 0 erlang recursion pattern-matching

我有一个评估函数(expr_eval/1),它应该评估一个表达式并返回一个数字.到目前为止,我的函数返回有效数字,如:

expr_eval({plus,{num, 17},{num,10}}) ? 27
Run Code Online (Sandbox Code Playgroud)

但不是这个:

expr_eval({mul,{plus,{num,5},{num,8}},{num,3}}) ? 39
Run Code Online (Sandbox Code Playgroud)

我的职责:

   expr_eval({mul, {num,A}, {num,B}}) ->A*B;
   expr_eval({plus, {num,A}, {num,B}}) ->A+B;
   expr_eval({minus, {num,A},{num,B}}) ->A-B;
   expr_eval({_,_,_})->nothing_matched.
Run Code Online (Sandbox Code Playgroud)

我知道它只是按原样采用模式,但我该如何解决这个问题呢?我可以硬编码并将下面的代码添加到我的函数中,上面的方程式可以正常工作,但它不适用于其他方程式.(例如expr_eval({minus,{plus,{num,5},{num,8} },{num,3}})→8)

expr_eval({mul, {plus,{num,A},{num,B}},{num,C}}) ->(A+B)*C;
Run Code Online (Sandbox Code Playgroud)

Odo*_*rus 5

我相信它必须是递归函数,类似于

expr({num,X}) -> X;
expr({plus, X, Y})  -> expr(X) + expr(Y);
expr({minus, X, Y}) -> expr(X) - expr(Y);
expr({mul,X, Y}) -> expr(X)*expr(Y);
expr(Any) -> io:format("Dont know what to do with ~p~n",[Any]).
Run Code Online (Sandbox Code Playgroud)