F# преобразовать Array2 в список

Я все еще новичок в функциональном программировании, поэтому, если я не могу понять, как что-то сделать, я возвращаюсь к процедурному стилю. Я нашел способ обойти необходимость преобразования в список, но мне все же хотелось бы знать, как это сделать.

Вот моя попытка преобразовать двумерный массив в список.

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))

person gradbot    schedule 15.03.2009    source источник
comment
где Array2 в .NET? Если это ваша функция, не могли бы вы предоставить исходный код? Спасибо   -  person gatoatigrado    schedule 07.06.2010
comment
Я считаю, что он был переименован в Array2D. Это во время выполнения F#. msdn.microsoft.com/en-us/library/ee353794.aspx   -  person gradbot    schedule 07.06.2010


Ответы (1)


По-видимому, в .Net многомерные массивы являются IEnumerable (неуниверсальными), и поэтому это работает:

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

РЕДАКТИРОВАТЬ: Как отмечает Нолдорин в комментарии, это даже лучше:

let l = a2 |> Seq.cast<int> |> Seq.toList
person Brian    schedule 15.03.2009
comment
Хорошее решение... Я только что удалил свой, так как он немного сложнее. Однако я мог бы также указать, что вторую строку можно упростить до: let l = a2 |› Seq.cast‹int› |› Seq.to_list - person Noldorin; 15.03.2009
comment
Отлично, спасибо, я подумал, что с IEnumerable можно что-то сделать, но я не знал, как это сделать. - person gradbot; 15.03.2009
comment
это Seq.toList, а не Seq.to_list.. (не могу редактировать, потому что SO говорит: Edits must be at least 6 characters, большое спасибо, SO.. :/) - person Michelrandahl; 19.04.2016