2009-05-10 17 views
13

Ho una sequenza di FileInfo, ma mi interessa solo i loro nomi di stringhe, quindi voglio una sequenza di stringhe. In un primo momento ho provato qualcosa di simile:Perché l'inferenza di tipo F # non può essere gestita da questo?

Seq.map (fun fi -> fi.Name) fis 

Ma per qualche ragione, s 'F # inferenza di tipo non è sufficiente per consentire a questa, e mi ha fatto esplicitamente dare un tipo di 'fi':

Seq.map (fun (fi : FileInfo) -> fi.Name) fis 

Perché è necessaria questa annotazione? Se è noto che fis : seq<FileInfo> e quello Seq.map : ('a -> 'b) -> seq<'a> -> seq<'b>, non si dovrebbe inferire che il tipo di espressione lambda è FileInfo -> 'b e quindi, da fi.Name : string, dedurre ulteriormente che il suo tipo è FileInfo -> string?

risposta

24

L'inferenza di tipo funziona da sinistra a destra. È qui che l'operatore della pipeline è utile; se si conosce già il tipo di 'fis', quindi scrivere come

fis |> Seq.map (fun fi -> fi.Name) 

e l'inferenza funziona per voi.

(In generale, espressioni della forma

o.Property 
o.Method args 

richiedono il tipo di 'o' essere conosciuto a priori, per molte altre espressioni, quando un tipo non è immobilizzato il sistema di inferenza può 'float un constraint' lungo che può essere risolto in seguito, ma per questi casi, non ci sono vincoli del modulo 'tutti i tipi con una proprietà denominata P' o 'tutti i tipi con un metodo denominato M' (come la digitazione anatra) che può essere rinviato e risolto in seguito, quindi è necessario che le informazioni ora, o l'inferenza non riesce immediatamente.)

Vedere anche un overview of type inference in F#.

+4

Spero che rendano l'inferenza di tipo più robusta. Ho già colpito alcuni casi in cui dovevo riordinare i metodi in una classe o ottenere errori di tipo troppo generico. – gradbot

+1

Per quello che vale, questo post sul blog e alcuni dei suoi commenti hanno una spiegazione utile di alcuni punti di forza e di debolezza di F # nel suo controllo di tipo: http://neilmitchell.blogspot.com/2008/12/f-from-haskell- perspective.html – Juliet

Problemi correlati