Erlang模式匹配顺序

时间:2018-06-29 13:35:55

标签: function recursion functional-programming erlang pattern-matching

我用Erlang写了一个简单的函数,将元组转换为列表。但是我不明白为什么模式匹配顺序在这里很重要:

示例

tupleToList(Tuple) -> tupleToList(Tuple, size(Tuple), []).
tupleToList(_, 0, L) -> L;
tupleToList(Tuple, S, L) -> tupleToList(Tuple, S - 1, [element(S, Tuple) | L]).

为什么下面的代码不正确?

tupleToList(Tuple) -> tupleToList(Tuple, size(Tuple), []).
tupleToList(Tuple, S, L) -> tupleToList(Tuple, S - 1, [element(S, Tuple) | L]);
tupleToList(_, 0, L) -> L.

1 个答案:

答案 0 :(得分:4)

因为that's how functions work in Erlang

  

如果找到了该函数,则会顺序扫描该函数的子句,直到找到一个满足以下两个条件的子句:

     
      
  • 子句标题中的模式可以与给定的参数成功匹配。
  •   
  • 保护序列(如果有)为真。
  •   

由于变量匹配所有内容,并且没有保护序列,因此在考虑tupleToList(Tuple, S, L)之前,总是在第二种情况下选择tupleToList(_, 0, L)子句。