我试图将二维数组暴露为对象上的一系列序列(以便能够专门做Seq.fold (fun x -> Seq.fold (fun ->..) [] x) []
mytype的东西)
以下是展示相同功能的玩具程序。
根据我的理解,这里有很多内容,IEnumerable
的第一个有一个模糊的重载,需要一个类型注释来明确地隔离你正在谈论的IEnumerable
。
但是,单位可能存在问题,需要额外的帮助:
type blah =
class
interface int seq seq with
member self.GetEnumerator () : System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable<(int*int)>> =
seq{ for i = 0 to 10 do
yield seq { for j=0 to 10 do
yield (i,j)} }
end
是否有某种方法可以使上述代码按预期工作(返回seq<seq<int>>
)或者我遗漏了哪些基本内容?
答案 0 :(得分:4)
一方面,GetEnumerator()
应该返回IEnumerator<T>
而不是IEnumerable<T>
...
这将使您的示例代码得到编译。
type blah =
interface seq<seq<(int * int)>> with
member self.GetEnumerator () =
(seq { for i = 0 to 10 do
yield seq { for j=0 to 10 do
yield (i,j)} }).GetEnumerator()
interface System.Collections.IEnumerable with
member self.GetEnumerator () =
(self :> seq<seq<(int * int)>>).GetEnumerator() :> System.Collections.IEnumerator
答案 1 :(得分:0)
怎么样:
let toSeqOfSeq (array:array<array<_>>) = array |> Seq.map (fun x -> x :> seq<_>)
但这适用于数组数组,而不是二维数组。你想要哪个?
答案 2 :(得分:0)
你真的要做什么?一系列seqs很少有用。所有集合都是seqs,因此您只需使用数组数组,即
let myArrayOfArrays = [|
for i = 0 to 9 do
yield [|
for j = 0 to 9 do
yield (i,j)
|]
|]
let sumAllProds = myArrayOfArrays |> Seq.fold (fun st a ->
st + (a |> Seq.fold (fun st (x,y) -> st + x*y) 0) ) 0
printfn "%d" sumAllProds
如果这有帮助......
答案 3 :(得分:0)
module Array2D =
// Converts 2D array 'T[,] into seq<seq<'T>>
let toSeq (arr : 'T [,]) =
let f1,f2 = Array2D.base1 arr , Array2D.base2 arr
let t1,t2 = Array2D.length1 arr - f1 - 1 , Array2D.length2 arr - f2 - 1
seq {
for i in f1 .. t1 do
yield seq {
for j in f2 .. t2 do
yield Array2D.get arr i j }}
let myArray2D : string[,] = array2D [["a1"; "b1"; "c1"]; ["a2"; "b2"; "c2"]]
printf "%A" (Array2D.toSeq myArray2D)