F#将Array2转换为列表

5

我对函数式编程还不太熟悉,所以如果我无法弄清楚如何做某件事,就会回到过程式风格。 我找到了一个解决方法,可以避免转换为列表,但我仍然想知道如何转换。

这是我将二维数组转换为列表的尝试。

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

.NET 中的 Array2 在哪里?如果这是您的函数,能否提供源代码?谢谢。 - gatoatigrado
我相信它已经被重命名为Array2D。它在F#运行时中。http://msdn.microsoft.com/en-us/library/ee353794.aspx - gradbot
1个回答

10

显然在 .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

编辑:正如Noldorin在评论中指出的那样,这甚至更好:

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

好的解决方案...我刚刚删除了我的代码,因为它稍微有点复杂。不过,我也可以指出第二行可以简化为:let l = a2 |> Seq.cast<int> |> Seq.to_list - Noldorin
太棒了,谢谢!我知道可以用IEnumerable做些什么,但不知道具体该怎么做。 - gradbot
它是 Seq.toList 而不是 Seq.to_list。 (无法编辑,因为 SO 说:“编辑必须至少为6个字符”,非常感谢 SO.. :/) - user483036

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接