2017-05-28 4 views
0

ich alle in der Liste Inhalt über TCP senden möchten, aber ich erhalte einige FehlerFür jeden wirft Fehler in erlang

Code, der die Listendaten

sendHistory(To, List) -> 
    lists:foreach(fun(#data{timestamp = T, data = D})-> 
    gen_tcp:send(To, T), 
    gen_tcp:send(To, D) 
       end, List). 

Und ich bekomme diese Fehlermeldung senden.

Error in process <0.65.0> with exit value: 
{function_clause,[{lists,foreach, 
         [#Fun<storage.0.129058542>, 
          {data,["1495971980"], 
           ["\n\t", 
          ["Jaam: ", 
           ["Kuressaare linn"], 
           " Temperature: ",[]], 
          "\n\t",...]}], 
         [{file,"lists.erl"},{line,1337}]}, 
        {storage,loop,4,[{file,"storage.erl"},{line,61}]}]} 
+1

Von der Fehlermeldung sieht es aus wie 'list' ist ein Tupel '{Daten, ...}', keine Liste. – Dogbert

+0

@Dogbert könnte ich sein, dass meine Methode, wo ich überprüfe, ob Element bereits in der Liste ist dies verursacht? schauen https://stackoverflow.com/questions/44218559/erlang-receive-is-not-receiving?noredirect=1#comment75448190_44218559 an der Methode Schleife und addToListIfNotAlreadyIn –

+0

Sieht aus wie Sie einen 'data' Datensatz statt eines vorbei sind seine Felder. Wollten Sie das 'data' _field_ des' data' Records extrahieren und an 'lists: foreach' übergeben? – Dogbert

Antwort

3

Die folgende Zeile Klausel in Ihrem vorherigen Code wird eine falsche Liste zu erstellen:

addToListIfNotAlreadyIn(New, [Old]) -> {[New | Old], ok}; 

Sie wahrscheinlich schreiben bedeutete:

addToListIfNotAlreadyIn(New, [Old]) -> {[New, Old], ok}; 

Die Fehlermeldung bedeutet, dass lists:foreach/2 aufgerufen wurde ein zweites Argument, das keine Liste war. Da lists:foreach/2recursively calls itself with the tail of the list after applying the function to the head, wenn eine falsche Liste an die Funktion übergeben wird, wird es selbst ruft am Ende mit einem nicht-Liste Argument auf der letzten Iteration:

1> lists:foreach(fun(X) -> ok end, [1, 2, 3 | 4]). 
** exception error: no function clause matching lists:foreach(#Fun<erl_eval.6.118419387>,4) (lists.erl, line 1337) 
+0

Das Beste, was zu tun ist, um die Klausel 'addToListIfNotAlreadyIn (neu, [Alt]) entfernen -> {[Neu | Alt], ok}; 'da es bereits Teil der letzten Klausel der Funktion ist: die ganze Funktion kann nur mit den Klauseln Nummer 1,4 und 5 geschrieben werden, die Zahl 2' addToListIfNotAlreadyIn (New, [New]) - > {[Neu], nok}; '(3) ist ein Spezialfall der Nummer 4' addToListIfNotAlreadyIn (New [Neu | T]) -> {[Neu | T], nok}; '(und 5) mit' T = [] ' – Pascal