我正在开发一个使用哈希树的p2p应用。
我正在编写哈希树构造函数(publ / 4和publ_top / 4),但我看不懂如何修复publ_top / 4。
我尝试用publ / 1构建一个树:
nivd:publ("file.txt").
prints hashes...
** exception error: no match of right hand side value [67324168]
in function nivd:publ_top/4
in call from nivd:publ/1
有问题的代码在这里:
http://github.com/AndreasBWagner/nivoa/blob/886c624c116c33cc821b15d371d1090d3658f961/nivd.erl
您认为问题在哪里?
谢谢你, 安德烈亚斯
答案 0 :(得分:4)
查看您的代码,我可以看到一个会产生特定异常错误的问题
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) ->
% ...