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

时间:2014-09-17 20:29:04

标签: recursion erlang pattern-matching

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

expr_eval({plus,{num, 17},{num,10}}) → 27

但不是这样:

expr_eval({mul,{plus,{num,5},{num,8}},{num,3}}) → 39

我的功能:

   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.

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

expr_eval({mul, {plus,{num,A},{num,B}},{num,C}}) ->(A+B)*C;

1 个答案:

答案 0 :(得分: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]).