2010-09-24 6 views
3

Je suis assez nouveau en F #.Différence entre Seq et Array pour la valeur de tableau

je suppose que les tableaux sont encore des collections, donc je pourrais utiliser Seq pour itérer le tableau comme celui-ci:

[|"a"; "b"|] |> Seq.map (fun f -> printfn "a") |> ignore;; 

Mais cela ne fonctionne pas - elle imprime rien. D'autre part, si j'utilise Array, il imprime les cordes:

[|"a"; "b"|] |> Array.map (fun f -> printfn "a") |> ignore;; 

Pourquoi est-ce?

+2

Vous n'utilisez pas la fonction 'printf' correctement,' printfn "a" 'ne imprime qu'une chaîne" a ". Si vous voulez imprimer une valeur, vous devez utiliser 'printfn"% A "anyValue'. Voir le module Printf pour tous les marqueurs de formatage possibles ('%'): http://msdn.microsoft.com/en-us/library/ee370560.aspx – Stringer

+0

Thx pour info. Je viens juste de C#, donc j'ai supposé que c'est quelque chose de similaire à 'string.Format' (ça ne regarde pas si vous passez des arguments, donc' string.Format ("{0}", 'a') fonctionne et 'string.Format (" a ")' fonctionne aussi .. Simplement - je ne cherchais pas la bonne commande Thx :) – stej

Répondre

6

Array.map construit un autre tableau - ce qui signifie qu'il doit le faire avec empressement. Vous ne pouvez pas construire un tableau et dire "Je remplirai les valeurs quand vous le voulez."

Les séquences, d'autre part, sont évalué paresseusement ... c'est seulement quand vous demandez les valeurs dans la séquence de résultats que le mappage sera évalué. Comme il est indiqué dans la documentation Seq.map:

La fonction donnée sera appliquée comme éléments sont demandés en utilisant la méthode MoveNext sur les agents recenseurs extraites de l'objet.

Si vous êtes familier avec LINQ, il est essentiellement la différence entre Enumerable.Select (produisant paresseusement une séquence) et Array.ConvertAll (projection avec impatience un tableau).

Aucune de ces sont la voie à itérer sur un tableau ou une séquence bien - ils sont projections. Comme le dit Stringer Bell, Array.iter et Seq.iter sont les fonctions appropriées pour l'itération.

+0

Thx, cette comparaison à 'Enumerable.Select' est parfaite. – stej

5

Vous devez utiliser Seq.iter si vous voulez itérer sur votre collection, comme ça:

[|"a"; "b"|] |> Seq.iter (fun f -> printfn "%A" f);; 

Aussi, vous pouvez simplement utiliser Array.iter, si seulement itérer sur les tableaux:

[|"a"; "b"|] |> Array.iter (fun f -> printfn "%A" f);; 

Une autre (et plus courte) alternative est directement piping votre valeur en printfn "%A" fonction:

[|"a"; "b"|] |> printfn "%A";; 

va imprimer [|"a"; "b"|]. Notez que dans ce cas, F # l'imprime exactement comme vous l'auriez codé.

Questions connexes