看你的代码,我可以看到一个问题会产生特定的异常错误
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([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) ->
% ...
如果你好奇,应用程序被描述如下:HTTP://wiki.github .com/AndreasBWagner/nivoa – andreasw 2009-06-14 00:47:07