2016-09-10 3 views
0

Ein Wörterbuch ist eine Liste von Paaren. Die Aufgabe besteht darin, ein Wörterbuch zu nehmen und ein Paar Listen zurückzugeben: die Schlüssel und Werte.Typ Fehler bei Rekursion akkumulierenden Listen

Ich habe versucht, es über das Wörterbuch iterieren (mit Rekursion) und akkumulieren Schlüssel und Werte in zwei Listen, aber ich bekomme einen Typ Fehler, der mich verblüfft.

Hinweis: Ich bin NICHT auf der Suche nach einer alternativen Lösung für die Aufgabe. Ich möchte den Fehler verstehen und korrigieren. Hier

ist der Code:

let lists_of_dict dict = 
    let rec separate dict keys values = 
    match dict with 
     [] -> (keys, values) 
    | (k, v)::t -> separate t k::keys v::values 
       (* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *) 
    in 
    separate dict [] [] 

(der unterstrichene Teil ist Zeichen 19-47 von Zeile 5)

Hier ist die Fehlermeldung:

File "lod-problem.ml", line 5, characters 19-47: 
Error: This expression has type 'a list 
     but an expression was expected of type 'b * 'c 

I kann‘ Ich verstehe, warum Ocaml diesen Typ ableitet und wie er versteht, dass der Ausdruck den Typ ('a list * 'b list) hat (wenn ich mich nicht irre).

Antwort

1

separate t k::keys v::values analysiert wie (separate t k) :: (keys v) :: values, nicht separate t (k::keys) (v::values) wie Sie beabsichtigt.

So sieht OCaml, dass Sie das Ergebnis mit :: bauen und damit das Ergebnis wird eine Liste sein (ganz abgesehen davon, dass die Argumente für :: auch die falsche Art haben - die Art Kontrolleur wird nie so weit), aber Das erwartete Ergebnis ist ein Tupel (weil das der erste Fall ist). Zu diesem Zeitpunkt ist der Typ-Checker fehlerhaft.

+0

Danke! Ich sollte Parens in der Zukunft liberaler verwenden ':)' – angus