为何Erlang的lists:all无法用于全字母句检测?代码报错解析
Erlang lists:all 用法问题解析
1. 为什么你的lists:all调用无法检测全字母句(pangram)?
其实不是lists:all不能用来做pangram检测,是你把函数的参数顺序搞反啦!
Erlang里lists:all/2的正确签名是:
lists:all(Fun, List)
它的作用是:对List里的每个元素应用Fun,只有当所有元素都让Fun返回true时,整个函数才返回true。
你写的代码把要检查的字母列表(lists:seq($a, $z))放在了第一个参数的位置,而把判断用的Fun放在了第二个位置——这完全不符合函数的定义,所以才会触发匹配失败的错误。
正确的用法应该是把Fun放在第一个参数,要检查的字母列表放在第二个参数:
Sentence = "abcdefghijklmnopqrstuvwxyz", lists:all(fun(X) -> lists:member(X, Sentence) end, lists:seq($a, $z)).
这样就能正确判断Sentence是否包含所有小写字母了。
2. 代码执行报错的具体原因
看你贴的报错信息:
** exception error: no function clause matching lists:all("abcdefghijklmnopqrstuvwxyz",#Fun<erl_eval.6.99386804>) (lists.erl, line 1212)
这个错误的核心就是参数顺序不匹配函数定义。Erlang的函数是严格匹配参数数量和类型的,lists:all/2只接受「函数 + 列表」的参数组合,而你传的是「列表 + 函数」,没有对应的函数 clause 能处理这种输入,所以就抛出了匹配失败的异常。
简单说,就是你把两个参数的位置搞反了,调整顺序之后就能正常运行了。
内容的提问来源于stack exchange,提问作者Muhammad Lukman Low
相关产品推荐
相关产品推荐

