在 Erlang 中的函数中传递映射类型参数会报错
Passing map type argument in function in Erlang complains error
这是我的代码片段。
%% test.erl
-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.
%% ErShell
1> c(test).
test.erl:19: illegal use of variable 'H' in map
test.erl:20: illegal use of variable 'H' in map
test.erl:20: variable 'N' is unbound
test.erl:22: illegal use of variable 'H' in map
error
我只是不知道为什么会报这样的错误,因为下面的代码运行得很好:
%% test2.erl
birthday(#{age := N} = Person) ->
Person#{age := N+1}.
%% ErShell
1> c(test2).
2> test2:birthday(#{age => 333}).
#{age => 334}
提前致谢。
原因很简单:地图还没有完全实现。看看:http://learnyousomeerlang.com/maps
此外,您可能会想到替代实现,使用地图已经可以实现的内容:
count_characters(Str) -> count_characters(Str, #{}).
count_characters([H|T], Map) ->
N = maps:get(H, Map, 0),
count_characters(T, maps:put(H, N + 1, Map));
count_characters([], Map) -> Map.
截至今天(2021 年),该功能仍未实现。
但是,对于较大的键,出于效率原因,建议使用 update
函数:
count_characters([H|T], Map) ->
case N = maps:get(H, Map, 0) of
0 -> count_chars(T, Map#{H => 1});
_ -> count_chars(T, Map#{H := N+1}) % update function maps:udpate(...)
end;
这是我的代码片段。
%% test.erl
-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.
%% ErShell
1> c(test).
test.erl:19: illegal use of variable 'H' in map
test.erl:20: illegal use of variable 'H' in map
test.erl:20: variable 'N' is unbound
test.erl:22: illegal use of variable 'H' in map
error
我只是不知道为什么会报这样的错误,因为下面的代码运行得很好:
%% test2.erl
birthday(#{age := N} = Person) ->
Person#{age := N+1}.
%% ErShell
1> c(test2).
2> test2:birthday(#{age => 333}).
#{age => 334}
提前致谢。
原因很简单:地图还没有完全实现。看看:http://learnyousomeerlang.com/maps
此外,您可能会想到替代实现,使用地图已经可以实现的内容:
count_characters(Str) -> count_characters(Str, #{}).
count_characters([H|T], Map) ->
N = maps:get(H, Map, 0),
count_characters(T, maps:put(H, N + 1, Map));
count_characters([], Map) -> Map.
截至今天(2021 年),该功能仍未实现。
但是,对于较大的键,出于效率原因,建议使用 update
函数:
count_characters([H|T], Map) ->
case N = maps:get(H, Map, 0) of
0 -> count_chars(T, Map#{H => 1});
_ -> count_chars(T, Map#{H := N+1}) % update function maps:udpate(...)
end;