Ich arbeite mit fsharp Typ Inferenz und ich versuche zu verstehen, wie sie funktionieren. Warum ist das so?F # Typ Inferenz
List.filter List.head
ist ein Typ bool list list -> bool list list
?
Ich arbeite mit fsharp Typ Inferenz und ich versuche zu verstehen, wie sie funktionieren. Warum ist das so?F # Typ Inferenz
List.filter List.head
ist ein Typ bool list list -> bool list list
?
List.filter
hat den Typ (nur List.filter;;
in FSI eingeben):
> List.filter;;
val it : (('a -> bool) -> 'a list -> 'a list)
so dauert es eine 'a -> bool
und führt zu einer 'a list -> 'a list
Jetzt man es füttert mit
> List.head;;
val it : ('b list -> 'b)
(Es ist ein weiterer 'a
wirklich, also habe ich es umbenannt) und jetzt haben Sie:
'a -> bool ~ 'b list -> 'b
Sie können diese vereinigen und sehen:
'b ~ bool
(von den rechtsen Seiten ->
)'a ~ 'b list ~ bool list
(von der linken Handseite)aber das alles zusammen und Sie erhalten die Antwort F # `s Typ-Inferenz gibt Ihnen:
'a list -> 'a list
~ ('b list) list -> ('b list) list
~ (bool list) list -> (bool list) list
~ bool list list -> bool list list
Entschuldigung, ich habe immer noch Schwierigkeiten zu verstehen, was bedeutet ~? – coder4lyf
kein Problem (hätte es erwähnen sollen) - es sollte * type-equality * anzeigen - es ist eine Haskell-Sache, bei der du nicht noch ein '' 'schreiben willst ... also lies es einfach als' = 'für Typen hier (zum Beispiel: ''a -> bool' sollte gleich '' b list -> 'b' sein, weil ich' List.head' in 'List.filter' stecke - Jetzt sind * functions-types gleich, wenn die linke -Handseiten und rechte Seiten sind * - also bekomme ich das: ''a' ist gleich' b Liste' und 'bool' ist gleich' 'b') – Carsten
Welchen Typ haben Sie erwartet? –