在erlang中列出尾部模式匹配

Posted

技术标签:

【中文标题】在erlang中列出尾部模式匹配【英文标题】:list tail pattern matching in erlang 【发布时间】:2018-12-26 09:57:09 【问题描述】:

假设我有两个列表:

First = [1,2,3,4].
Second = [1,2,3,4,234242].

我知道第二个列表的所有元素都与第一个列表的元素匹配,除了最后一个额外的元素。如何使用模式匹配来获取最后一个?

【问题讨论】:

鉴于列表的定义方式,我们无法将模式与列表中的最后一个元素进行匹配。 【参考方案1】:

您可以编写一个函数,只要元素相等,就向下递归两个列表,然后在第一个列表为空时返回第二个列表的最后一个元素:

find_tail([Head | Tail1], [Head | Tail2]) ->
    find_tail(Tail1, Tail2);
find_tail([], [Last]) ->
    Last.

只有当第一个列表是字面常量时,您才可以使用普通模式匹配来做到这一点:

1> [1,2,3,4] ++ [Last] = [1,2,3,4,234242].
[1,2,3,4,234242]
2> Last.
234242

但是如果是变量就不行了:

3> X = [1,2,3,4].
[1,2,3,4]
4> X ++ [Last] = [1,2,3,4,234242].
* 1: illegal pattern

【讨论】:

我想在没有函数调用的情况下做到这一点。只是通过模式匹配。假设额外的项目位于我列表的首位。然后我可以写:[TheItem |第一个] = 第二个。 @MehdiPourfar,正如Robert K 提到的,除非您枚举模式中的所有先前元素,否则您无法匹配列表的最后一个元素,例如[_,_,_,_,Last] = Second. 我用模式匹配示例更新了我的答案 - 这更有意义吗?

以上是关于在erlang中列出尾部模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

为啥 OCaml 模式匹配比 Erlang 弱?

Erlang 模式匹配顺序

Erlang中模式匹配到单数下划线符号'_'的含义

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

在 Erlang 中进行模式匹配映射时,为啥这个变量是未绑定的?

Erlang函数与模式匹配