2011-04-08 32 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)