在erlang中列出尾部模式匹配

Meh*_*far 0 erlang pattern-matching

假设我有两个列表:

First = [1,2,3,4].
Second = [1,2,3,4,234242].
Run Code Online (Sandbox Code Playgroud)

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

leg*_*cia 6

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

find_tail([Head | Tail1], [Head | Tail2]) ->
    find_tail(Tail1, Tail2);
find_tail([], [Last]) ->
    Last.
Run Code Online (Sandbox Code Playgroud)

只有当第一个列表是文字常量时,才可以使用普通模式匹配来执行此操作:

1> [1,2,3,4] ++ [Last] = [1,2,3,4,234242].
[1,2,3,4,234242]
2> Last.
234242
Run Code Online (Sandbox Code Playgroud)

但如果它是一个变量,你不能这样做:

3> X = [1,2,3,4].
[1,2,3,4]
4> X ++ [Last] = [1,2,3,4,234242].
* 1: illegal pattern
Run Code Online (Sandbox Code Playgroud)

  • @MehdiPourfar,正如``Robert K`所提到的,你不能模式匹配列表的最后一个元素,除非你枚举模式中的所有先前元素,例如`[_,_,_,_,Last] = Second. (4认同)