Ich habe eine einfache Funktion erstellt, die bei einer Liste eine Liste zurückgibt, in der das zusammenhängende Vorkommen eines Elements in der Eingabe auf eins reduziert wird.Werteinschränkung und Typschlussfolgerung
let rec reduce l =
match l with
| [] -> []
| [x] -> [x]
| x::(y::_ as xs) -> if x = y then
reduce xs
else
x::(reduce xs)
# reduce [1;1;2;2;2;3;3;4;3;3;3];;
- : int list = [1;2;3;4;3].
# reduce [’a’;’a’;’a’;’b’];;
- : char list = [’a’; ’b’].
# reduce [];; // The case
- : ’a list = []
Alles wie erwartet, mit Ausnahme der leeren Liste []
Eingang. Der Beschwerdeführer sagt Fehler FS0030: Werteinschränkung. Ich versuchte, ein besseres Verständnis der Phänomene durch die documentation zu bekommen, aber ich habe das Gefühl, dass ich immer noch nicht über die Fähigkeiten verfüge, den Punkt richtig zu verstehen. Warum benötigt eine generische Funktion den Fall, dass []
als Typ angegeben wird? Konnte das Ergebnis []
nicht ohne Typrückschluss gemeldet werden? Und schließlich, wie sollte die Funktion strukturiert sein, um einen solchen Fall zu berücksichtigen?
Das Problem ist, dass '[]' ist '' eine Liste 'aber der Compiler muss herausfinden, was' A' ist und kann nicht –
Vielen Dank @JohnPalmer für Ihren Beitrag. – Worice