Tengo una secuencia de FileInfo, pero solo me importan sus nombres de cadena, así que quiero una secuencia de cadena. Al principio traté de algo como esto:¿Por qué la inferencia de tipos de F # no puede manejar esto?
Seq.map (fun fi -> fi.Name) fis
Pero por alguna razón, F # 's inferencia de tipos no es suficiente para permitir esto, y me hizo dar explícitamente un tipo de 'fi':
Seq.map (fun (fi : FileInfo) -> fi.Name) fis
¿Por qué se requiere esta anotación? Si se sabe que fis : seq<FileInfo>
y Seq.map : ('a -> 'b) -> seq<'a> -> seq<'b>
, ¿no debería inferirse que el tipo de expresión lambda es FileInfo -> 'b
y luego, a partir del fi.Name : string
, infiere que su tipo es FileInfo -> string
?
Espero que hagan la inferencia de tipo más robusta. Ya llegué a algunos casos en los que tuve que reordenar los métodos en una clase o recibiría errores de tipo demasiado genéricos. – gradbot
Por lo que vale, esta publicación de blog y algunos de sus comentarios tienen una explicación útil de algunas de las fortalezas y debilidades de F # en su comprobador de tipos: http://neilmitchell.blogspot.com/2008/12/f-from-haskell- perspective.html – Juliet