Erlang 模式匹配顺序

ale*_*man 1 erlang recursion 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]).
Run Code Online (Sandbox Code Playgroud)

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

tupleToList(Tuple) -> tupleToList(Tuple, size(Tuple), []).
tupleToList(Tuple, S, L) -> tupleToList(Tuple, S - 1, [element(S, Tuple) | L]);
tupleToList(_, 0, L) -> L.
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 5

因为这就是函数在 Erlang 中的工作方式

如果找到函数,则依次扫描函数子句,直到找到满足以下两个条件的子句:

  • 子句标题中的模式可以与给定的参数成功匹配。
  • 守卫序列,如果有的话,是真的。

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