2009-06-13 17 views
0

Ich arbeite an einer P2P-App, die Hash-Bäume verwendet.Erlang Hash Tree

Ich schreibe die Hash-Baumkonstruktion Funktionen (publ/4 und publ_top/4) aber ich kann nicht sehen, wie man publ_top/4 repariert.

Ich versuche, einen Baum mit publ/1 zu bauen: ist hier

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 

Der Code in Frage:

http://github.com/AndreasBWagner/nivoa/blob/886c624c116c33cc821b15d371d1090d3658f961/nivd.erl

Wo denken Sie ist das Problem?

Danke, Andreas

+0

Wenn Sie neugierig sind, ist die App hier beschrieben: http: //wiki.github .com/AndreasBWagner/nivoa – andreasw

Antwort

4

auf dem Code der Suche ich ein Problem sehen, dass dieser besonderen Ausnahmefehler

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. 

In der ersten Funktionsdeklaration erzeugen würden Sie gegen die leere Liste übereinstimmen. In der zweiten Deklaration stimmen Sie mit einer Liste der Länge (mindestens) 2 überein ([F,S|T]). Was passiert, wenn FullLevelLen sich von 1 unterscheidet und RestOfLevel eine Liste der Länge 1 ist? (Tipp: Sie erhalten den obigen Fehler).

würde der Fehler einfacher, wenn Sie auf die Funktionsargumente würde Mustererkennung zu erkennen, vielleicht so etwas wie:

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) -> 
%  ... 
+0

Danke! Das Programm erstellt einen Hash-Baum und Ihre Style-Tipps haben meine Programmierung verbessert. – andreasw