2011-04-08 58 views
3

我试图暴露出2维数组作为序列的对象上的序列(以能够做具体Seq.fold (fun x -> Seq.fold (fun ->..) [] x) [] MYTYPE东西)在F#实现序列的序列

下面是一个玩具程序暴露该相同功能。

从我所了解的情况来看,这里有很多事情发生,首先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

你会觉得别人学习FP会记得检查自己的类型签名....感谢大家的帮助 – Snark 2011-04-08 20:44:27

回答

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 
+0

感谢,这也正是我一直在寻找 – Snark 2011-04-08 20:45:18

0

如何:

let toSeqOfSeq (array:array<array<_>>) = array |> Seq.map (fun x -> x :> seq<_>) 

但是这一点也适用数组的数组,而不是一个二维数组。你要哪个?

0

你真的要做什么? seqs 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 

是否有帮助?

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)