2009-05-10 4 views
13

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?

Respuesta

24

La inferencia de tipo funciona de izquierda a derecha. Aquí es donde el operador de la tubería es útil; si ya conoce el tipo de 'fis', escríbalo como

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

y la inferencia funciona para usted.

(En general, expresiones de la forma

o.Property 
o.Method args 

requieren el tipo de 'o' a ser conocido a priori; para la mayoría de otras expresiones, cuando un tipo no está inmovilizado el sistema de inferencia puede 'flotar una restricción' a lo largo que se puede resolver más tarde, pero para estos casos, no hay restricciones de la forma 'todos los tipos con una propiedad llamada P' o 'todos los tipos con un método llamado M' (como pato escribiendo) que pueda posponerse y resuelto más tarde. Así que hay que información ahora, o inferencia falla inmediatamente.)

Ver también overview of type inference in F#.

+4

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

+1

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

Cuestiones relacionadas