Erlang 模式匹配顺序

Posted

技术标签:

【中文标题】Erlang 模式匹配顺序【英文标题】:Erlang Pattern Matching Order 【发布时间】:2018-12-08 17:25:48 【问题描述】:

我在 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】:

因为that's how functions work in Erlang:

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

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

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

【讨论】:

谢谢。在这里理解我的错误。 tupleToList(Tuple, S, L) 匹配 (Tuple,0,L) 这就是第二个模式无法访问的原因。

以上是关于Erlang 模式匹配顺序的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Erlang 中的模式匹配

在erlang中列出尾部模式匹配

什么是Erlang中的模式匹配

Erlang中模式匹配字符串的正确方法

为啥 Erlang 中的模式匹配记录会抛出错误

erlang - 接收循环模式匹配问题