Erlang - карты: итератор / 1 и карты: следующий / 1 устарели? - PullRequest
0 голосов
/ 05 мая 2020

Я пытался перебрать карту, которую я сделал:

getMinTreeHeight(TreeList,TreeMap) -> lists:foreach(fun(X) -> TreeMap#{X => getTreeHeight(X)} end, TreeList),
                                      Iter = maps:iterator(TreeMap),
                                      findMin(Iter,infinity,key).

findMin(Iterator,Min,Key) -> case maps:next(Iterator) of
                                none -> Key;
                                {K,V,I} -> if
                                             V < Min -> findMin(I,V,K) ;
                                             true -> findMin(I,Min,Key)
                                           end
                             end.

это 2 функции, в верхней функции i go через каждое значение в списке и что-то сделать на нем, затем я вставляю пару в карту. наконец, я создаю итератор (который есть в документации erlang.org). во второй функции я просто перебираю карту, используя maps: next, с заданным итератором. когда я пытаюсь скомпилировать свой модуль, он сообщает мне, что итераторы / 1 и next / 1 не определены. кто-нибудь знает, правильно ли я их использую? или если они еще действующие функции? Я использую erlang / OTP20, если это актуально

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Это наоборот - maps:iterator/1 и maps:next/1 были введены в Erlang / OTP 21.0, поэтому вы не можете вызывать их из версии 20.

Вы можете сказать, посмотрев на документация : справа от сигнатуры функции отображается «OTP 21.0», чтобы указать, в каком выпуске эта функция была представлена.

0 голосов
/ 05 мая 2020

a.erl:

-module(a).
-compile(export_all).
-include_lib("eunit/include/eunit.hrl").

getTreeHeight(X) ->
    X.

getMinTreeHeight(TreeList,TreeMap) -> lists:foreach(fun(X) -> TreeMap#{X => getTreeHeight(X)} end, TreeList),
                                      Iter = maps:iterator(TreeMap),
                                      findMin(Iter,infinity,key).

findMin(Iterator,Min,Key) -> case maps:next(Iterator) of
                                none -> Key;
                                {K,V,I} -> if
                                             V < Min -> findMin(I,V,K) ;
                                             true -> findMin(I,Min,Key)
                                           end
                             end.

В оболочке:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(a).
a.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,a}

3> 
...