erlang - 列表中组的模式匹配
问题描述
我正在学习 Erlang,Learn you some 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.
解决方案
它呈现以下异常:
异常错误:没有匹配 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 整除时,第一个定义将引发错误——大概是为了提醒用户有问题。您的版本默默地“失败”。看起来您所做的只是反转第一个版本中的参数,然后在基本情况下,您的版本匹配任何内容而不是空列表。
推荐阅读
- vb.net - VB.NET 服务器不接收来自远程客户端的连接请求
- php - 如何防止为在 Laravel 中同时处理的请求创建多个条目
- .net - 在 Windows 10 IOT 上运行的 .net Core 3 是否可以与 WPF 一起使用?
- node.js - Nest JS - 为返回 Observable Axios 响应的函数编写 Jest 测试用例的问题
- ocaml - 如何使用 OCaml 中的字符串格式从文件中读取数字列表
- javascript - 离子条码扫描器时间戳集成
- laravel - 在 Laravel 5.5 中保存值为 0 的数字字段
- pandas - 按元素拆分列并使用 pandas 创建新列
- python - 使用迭代 DFS 获取二叉树中节点的深度?
- ruby - 数组中奇数的总和