[Erlang] count_characters更正

在 《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}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值