Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Map Erlang映射中的非法模式_Map_Erlang - Fatal编程技术网

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):

  • 还不支持将变量作为匹配项中的键(17.0版)
  • 一个更普遍的问题会影响函数的匹配参数:第7行的
    H
    匹配了2次;或者一次,然后用来匹配N。(此问题也出现在二进制文件中)
  • 这应该在即将发布的版本中解决

    从第17版开始:

    以下是另一个版本(仅在18日测试),与本书中的版本稍有相似:

    -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.