【问题标题】:Passing map type argument in function in Erlang complains error在 Erlang 的函数中传递映射类型参数会报错
【发布时间】:2015-07-25 18:57:58
【问题描述】:

这是我的代码 sn-p。

%% 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}

提前致谢。

【问题讨论】:

    标签: erlang erlang-shell


    【解决方案1】:

    截至今天(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;
    

    【讨论】:

      【解决方案2】:

      原因很简单:地图还没有完全实现。看一看: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.
      

      【讨论】:

      • 就像一个附加组件:您可能已经在 J​​oe 的 Programming Erlang, 2nd ed 中找到了您的代码,对吧?它已经在勘误表上。它会在未来的某个时间起作用。
      猜你喜欢
      • 2012-07-26
      • 2011-06-10
      • 1970-01-01
      • 2023-01-30
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多