Map Erlang映射中的非法模式
代码如下:Map Erlang映射中的非法模式,map,erlang,Map,Erlang,代码如下: -module(map_demo). -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_ch
-module(map_demo).
-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.
在Erlang shell中编译代码时,它报告了以下错误:
1> c(map_demo).
map_demo.erl:7: illegal pattern
map_demo.erl:8: variable 'N' is unbound
map_demo.erl:10: illegal use of variable 'H' in map
map_demo.erl:7: Warning: variable 'H' is unused
error
我是新来的二郎,只是自己找不到任何错误。如何更正它?匹配语法中的问题 Fof匹配使用
:=
。范例
test(#{key:=test})->
测试。
对于相关的键和值,请使用=>
。例子:
M=#{keynew=>123}
来自IRC的答案(#erlang@freenode):
H
匹配了2次;或者一次,然后用来匹配N。(此问题也出现在二进制文件中)-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 := Count } = X,
count_characters(T, X#{ H := Count+1 })
end;
count_characters([], X) ->
X.
当您要匹配地图时,需要如下所示:
#{key1 := Pattern1, key2 := Pattern2, ...} = VarContainingAMap.
您可以阅读以下文档:
我猜您正在使用R17,因为此功能仅在此版本中可用 查看一些文档,我的理解是您应该以这种方式编写代码(我无法测试它,我仍在使用R15:o) -模块(计数字符) %%原料药 -导出([count/1]) count(Str)->count_chars(Str,maps:new()) 计数字符([H | T],Map)何时为_Map(Map)-> 计数字符([],映射)->映射 引自: OTP-11616==erts stdlib hipe透析器编译器类型==
EEP43: New data type - Maps
With Maps you may for instance:
-- M0 = #{ a => 1, b => 2}, % create associations
-- M1 = M0#{ a := 10 }, % update values
-- M2 = M1#{ "hi" => "hello"}, % add new associations
-- #{ "hi" := V1, a := V2, b := V3} = M2. % match keys with
values
For information on how to use Maps please see the Reference
Manual.
The current implementation is without the following features:
-- No variable keys
-- No single value access
-- No map comprehensions
Note that Maps is experimental during OTP 17.0.
目前,您可以使用映射
模块实现字符计数
:
count_characters(Str) ->
count_characters(Str, #{}).
count_characters([H|T], X) ->
count_characters(T, maps:put(H, maps:get(H, X, 0) + 1, X));
count_characters([], X) ->
X.
@埃维特,菲利佩·马夫拉:
地图只做它应该做的事;这里缺少的是减少部分:
count(Str) -> M = count_chars(Str, maps:new()), % maps part, bad naming
L = maps:to_list(M), % to be able to sum
N = [X || {_,X} <- L], % strip the numbers
lists:sum(N). % sum them up
count_chars([H|T], Map) when is_map(Map)->
N = maps:get(H, Map, 0),
count_chars(T, maps:put(H, N + 1, Map));
count_chars([], Map) -> Map.
count(Str)->M=count\u字符(Str,映射:new()),%maps部分,错误命名
L=映射:到列表(M),能够求和的百分比
N=[X |{|,X}
N=Map:get(H,Map,0),
计数字符(T,映射:put(H,N+1,映射));
计数字符([],映射)->映射。
那么,如何更正代码?我刚刚尝试了你的方法。但它不起作用。对不起,我跳过了一分钟。如果你使用map,key是不可变的,需要用作#{key=>Value}。我能找到的最接近的东西是这是一个“已知的bug”.这些erlang人是认真的吗?在这种情况下,这是一个巨大的错误!我认为这是你从Joe Armstrong自己的“编程erlang”中得到的东西,我感到震惊的是,这根本不起作用!从erlang/OTP 18.0开始,这段代码“只”抛出错误7号线,8号线,8号线,7号线,8号线,因为绑定变量是合法的,因为8号线,7号线,8号线,8号线,7号线,8号线,8号线,8号线,8号线,8因为绑定变量是合法的,因为在地图中使用,8号线,7号线,8号线,8号线,8号线,8号线,8因为绑定变量是因为,因为8号线,8号,8号线,8号线,8号线,8号,因为绑定变量是因为绑定变量是法律使用在地图中使用在地图中使用的使用的使用的使用的使用:因为:因为:7,7,7,8号线,8号线:因为:因为:因为:7,8,8号线,8号线7,8号线7,8,8号线,8号线,8号线,因为:因为绑定变量:因为绑定变量:因为:因为:因为:因为:因为:因为:因为:因为:{K=>isalie}.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu{
运行版本20,这仍然是一个bug?!也许我会在生气之前再研究一下,但是…@alexakarpov没有,bug(接受答案中的第1点)在R18中得到了修复,剩下的问题(第2点)这不是一个bug。或者更确切地说,这是本书中的bug,而不是Erlang中的bug。请详细说明为使此应答功能正常运行所做的更改。仅仅给出代码并不能帮助澄清最初的错误。既然(1)是这样,那么在17.0中使用maps编写此代码的正确方法是什么?
EEP43: New data type - Maps
With Maps you may for instance:
-- M0 = #{ a => 1, b => 2}, % create associations
-- M1 = M0#{ a := 10 }, % update values
-- M2 = M1#{ "hi" => "hello"}, % add new associations
-- #{ "hi" := V1, a := V2, b := V3} = M2. % match keys with
values
For information on how to use Maps please see the Reference
Manual.
The current implementation is without the following features:
-- No variable keys
-- No single value access
-- No map comprehensions
Note that Maps is experimental during OTP 17.0.
count_characters(Str) ->
count_characters(Str, #{}).
count_characters([H|T], X) ->
count_characters(T, maps:put(H, maps:get(H, X, 0) + 1, X));
count_characters([], X) ->
X.
count(Str) -> M = count_chars(Str, maps:new()), % maps part, bad naming
L = maps:to_list(M), % to be able to sum
N = [X || {_,X} <- L], % strip the numbers
lists:sum(N). % sum them up
count_chars([H|T], Map) when is_map(Map)->
N = maps:get(H, Map, 0),
count_chars(T, maps:put(H, N + 1, Map));
count_chars([], Map) -> Map.