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
?
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
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