2009-03-15 11 views
4

Je suis encore novice en programmation fonctionnelle, donc si je n'arrive pas à comprendre comment faire quelque chose, je reviens au style procédural. J'ai trouvé un moyen de contourner l'obligation de convertir en liste, mais j'aimerais quand même savoir comment.F # convertir Array2 en une liste

Voici ma tentative de convertir un tableau bidimensionnel en liste.

let board = Array2.init 10 20 (fun i j -> pull(i, j)) 

let mutable pieces = [] 

board 
|> Array2.mapi (fun i j a -> transform(i, j, a)) 
|> Array2.iter (fun a -> (pieces <- a :: pieces)) 
+0

où est Array2 dans .NET? Si c'est votre fonction, pourriez-vous fournir la source? Merci – gatoatigrado

+0

Je crois qu'il a été renommé en Array2D. C'est dans l'exécution F #. http://msdn.microsoft.com/en-us/library/ee353794.aspx – gradbot

Répondre

7

Apparemment en .Net, les tableaux multidimensionnels sont IEnumerable (non générique), et donc cela fonctionne:

let a2 = Array2.init 2 3 (fun x y -> (x+1)*(y+1)) 
let l = a2 |> Seq.cast<int> |> Seq.fold (fun l n -> n :: l) [] 
printfn "%A" l 

EDIT: Comme le souligne noldorin dans un commentaire, cela est encore mieux :

let l = a2 |> Seq.cast<int> |> Seq.toList 
+0

Bonne solution ... Je viens de supprimer le mien, car c'est un peu plus compliqué. Cependant, je pourrais aussi bien souligner que la deuxième ligne peut être simplifiée à: let l = a2 |> Seq.cast |> Seq.to_list – Noldorin

+0

Merci beaucoup, je me suis dit qu'il y avait quelque chose que je pouvais faire avec IEnumerable mais je ne l'ai pas fait. savoir comment le faire. – gradbot

+0

son 'Seq.toList' pas' Seq.to_list' .. (ne peut pas modifier parce que SO dit: 'Les modifications doivent être au moins 6 caractères', merci beaucoup SO ..: /) – Michelrandahl

Questions connexes