在 《Erlang 程序设计》书中第五章第63页,函数count_characters/1 编译出现错误。
课本源码:
-module(count_chars).
-export([count_characters/1]).
count_characters(Str) ->
count_characters(Str, #{}).
count_characters([H|T], #{ H := N }=X) ->
count_characters(T, X#{ H := N + 1 });
count_characters([H|T], X) ->
count_characters(T, X#{ H => 1 });
count_characters([], X) ->
X.
编译后错误:
$ erl
Eshell V9.3 (abort with ^G)
1> c(count_chars).
count_chars.erl:8: variable 'H' is unbound
error
原因:函数的字句1中的映射组内变量 H 定义与映射组之外,必须要绑定的。
解决方法:利用函数 map:is_key/2 判断当前 H 是否是 key,如果不是,就使用表达式 K => V 给映射组添加一个全新的键值对,否则用表达式 K := V 更新键值对。
修改后可运行版本如下:
源码:
-module(count_chars).
-export([count_characters/1]).
count_characters(Str) ->
count_characters(Str, #{}).
count_characters([H | T], X) ->
case maps:is_key(H, X) of
false -> count_characters(T, X#{ H => 1 });
true -> #{ H := N } = X,
count_characters(T, X#{ H := N + 1 })
end;
count_characters([], X) ->
X.
运行结果:
2> c(count_chars).
{ok,count_chars}
3> count_chars:count_characters("hello").
#{101 => 1,104 => 1,108 => 2,111 => 1}