2013-06-27 2 views
2

Si je déclare cette fonction F #:F inférence # Type misses informations données

let extractColumn col (grid : List<Map<string, string>>) = 
    List.map (fun row -> row.[col]) grid 

le compilateur se plaint:

erreur FS0752: 'expr [IDX]' L'opérateur a été utilisé sur une objet de type indéterminé sur la base des informations antérieures à ce point de programme. Pensez à ajouter d'autres contraintes de type

Ajout d'un paramètre annotation de type pour le lambda row résout le problème:

let extractColumn col (grid : List<Map<string, string>>) = 
    List.map (fun (row : Map<string, string>) -> row.[col]) grid 

Pourquoi ne peut-il obtenir le type de row du paramètre de la fonction extractColumngrid?

Répondre

8

L'inférence de type F # fonctionne de gauche à droite et de haut en bas. Le type grid n'est pas disponible dans la partie List.map (fun row -> row.[col]).

utilisant l'opérateur de tuyaux |>:

let extractColumn col (grid : Map<string, string> list) = 
    grid |> List.map (fun row -> row.[col]) 

fait votre travail par exemple comme prévu.