コードを見ると、その特定の例外エラーを生成する問題が 1 つあります。
publ_top(_,[],Accumulated,Level) ->
%% Go through the accumulated list of hashes from the prior level
publ_top(string:len(Accumulated),Accumulated,[],Level+1);
publ_top(FullLevelLen,RestofLevel,Accumulated,Level) ->
case FullLevelLen =:= 1 of
false -> [F,S|T]=RestofLevel,
io:format("~w---~w~n",[F,S]),
publ_top(FullLevelLen,T,lists:append(Accumulated,[erlang:phash2(string:concat([F],[S]))]),Level);
true -> done
end.
最初の関数宣言では、空のリストと照合します。2 番目の宣言では、長さ (少なくとも) 2 ( ) のリストと照合します[F,S|T]
。FullLevelLen
が1 とは異なりRestOfLevel
、長さが 1 のリストの場合はどうなりますか? (ヒント: 上記のエラーが表示されます)。
関数の引数でパターン マッチを行うと、エラーを見つけやすくなります。おそらく次のようになります。
publ_top(_,[],Accumulated,Level) ->
%% Go through the accumulated list of hashes from the prior level
publ_top(string:len(Accumulated),Accumulated,[],Level+1);
publ_top(1, _, _, _) ->
done;
publ_top(_, [F,S|T], Accumulated, Level) ->
io:format("~w---~w~n",[F,S]),
publ_top(FullLevelLen,T,lists:append(Accumulated,[erlang:phash2(string:concat([F],[S]))]),Level);
%% Missing case:
% publ_top(_, [H], Accumulated, Level) ->
% ...