列表中组的模式匹配

Posted

技术标签:

【中文标题】列表中组的模式匹配【英文标题】:Pattern matching on groups in list 【发布时间】:2019-12-10 09:15:27 【问题描述】:

我正在使用Learn you some erlang 学习 Erlang,并且我正在将一个列表分组为 3 的元组。我不明白为什么本书的实现如下:

group([], Acc) ->Acc
group([A,B,X|Rest], Acc) -> group(Rest, [A,B,X | Acc]).

输入

  group([],[1,2]).

因为它呈现以下异常:

异常错误:没有函数子句匹配 hth:group([],[1,2]) (d:/Erlang/AeRlang/hth.erl,第 15 行)

不应该是:

group(Acc,[X,Y,Z|T])->group([X,Y,Z|Acc],T);
group(Acc,_)->Acc.

【问题讨论】:

【参考方案1】:

它呈现以下异常:

异常错误:没有匹配 hth:group([],[1,2]) 的函数子句 (d:/Erlang/AeRlang/hth.erl,第 15 行)

真的吗?首先,让我们修复语法错误:

group([], Acc) ->Acc;
group([A,B,X|Rest], Acc) -> group(Rest, [A,B,X | Acc]).

在外壳中:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(a).
a.erl:2: Warning: export_all flag enabled - all functions will be exported
ok,a

2> a:group([], [1, 2]).
[1,2]

不应该是:

group(Acc,[X,Y,Z|T])->group([X,Y,Z|Acc],T);
group(Acc,_)->Acc.

让我们试试吧:

11> a:group([], [1, 2, 3, 4, 5, 6, 7, 8]).   
[4,5,6,1,2,3]

当列表中的元素数量不能被 3 整除时,第一个定义将引发错误——大概是为了提醒用户有问题。您的版本默默地“失败”。看起来您所做的只是反转第一个版本中的参数,然后在 基本情况中,您的版本匹配任何内容而不是空列表。

【讨论】:

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

你如何在 Haskell 中使用模式匹配和元组列表?

正则表达式:如何访问一个组的多个匹配项? [复制]

Elixir 列表模式匹配 ~ 在使用列表模式匹配常量后得到 x

正则表达式匹配

Python中列表的模式匹配

在erlang中列出尾部模式匹配