2015-09-29 9 views
7

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?

+0

Welchen Typ haben Sie erwartet? –

Antwort

10

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 
+0

Entschuldigung, ich habe immer noch Schwierigkeiten zu verstehen, was bedeutet ~? – coder4lyf

+0

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