【问题标题】:Implementing sequences of sequences in F#在 F# 中实现序列序列
【发布时间】:2011-08-01 19:18:51
【问题描述】:

我正在尝试将二维数组公开为对象上的序列序列(以便能够专门做 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&lt;seq&lt;int&gt;&gt;)还是我遗漏了一些基本的东西?

【问题讨论】:

  • 你会认为学习 FP 的人会记得检查他的类型签名......谢谢大家的帮助

标签: interface f# types overriding


【解决方案1】:

一方面,GetEnumerator() 应该返回 IEnumerator&lt;T&gt; 而不是 IEnumerable&lt;T&gt;...

这将使您的示例代码编译。

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

【讨论】:

    【解决方案2】:

    怎么样:

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

    但这适用于数组数组,而不是二维数组。你要哪个?

    【讨论】:

      【解决方案3】:

      你真的想做什么? seq of seqs 很少有用。所有的集合都是seqs,所以你可以只使用一个数组数组,一个la

      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
      

      如果有帮助的话……

      【讨论】:

        【解决方案4】:
           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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-04
          • 2021-03-16
          • 1970-01-01
          • 2016-05-18
          • 1970-01-01
          • 1970-01-01
          • 2011-07-13
          相关资源
          最近更新 更多