【问题标题】:Recursive sequence generation递归序列生成
【发布时间】:2014-11-29 21:10:49
【问题描述】:

我正在尝试通过从我的数据源递归读取数据来生成切片序列。

let rec read stream startFrom (conn : IEventStoreConnection) = 
    seq {
        let size = 10000
        let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result

        Console.WriteLine("Events in slice: " + slice.Events.Count().ToString())

        if (slice.IsEndOfStream) then
           yield slice
        else
           yield! read stream (startFrom + 1 * size) conn 
    }

let slices = read "stream-name" 0 conn

Console.WriteLine("TOTAL slices in sequence: " + (Seq.length slices).ToString());

我期待序列包含三个项目,但它似乎只返回一个,最后一个。

Events in slice: 10000
Events in slice: 10000
Events in slice: 4501
TOTAL slices in sequence: 1

为什么我的递归调用的结果也没有产生?范围界定的事情?

【问题讨论】:

  • 所以想想会发生什么 - 如果你不在流的末尾,你递归直到你在末尾。只有流的末尾才会真正返回一些东西。

标签: .net recursion f#


【解决方案1】:

对此的另一种看法(它不尝试以这种方式封装切片加载,选择单独管理该方面以并行化事件的“播放”,与 NES 或 GES 一起使用 theta),见loading/deserialization loop in FunDomain

注意 FunDomain 中的所有代码实际上只是 FsUno.Prod 重构了很多。

【讨论】:

    【解决方案2】:

    正如约翰已经告诉你的,你也必须让出其他切片:

    let rec read stream startFrom (conn : IEventStoreConnection) = 
        seq {
            let size = 10000
            let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result
    
            Console.WriteLine("Events in slice: " + slice.Events.Count().ToString())
    
            if (slice.IsEndOfStream) 
            then
               yield slice
            else
               yield slice // here
               yield! read stream (startFrom + 1 * size) conn 
        }
    

    我认为您可以使用内部函数稍微清理一下:

    let read (conn : IEventStoreConnection) stream startFrom = 
        let size = 10000
        let rec loop startFrom =
           seq {
               let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result
    
               Console.WriteLine("Events in slice: " + slice.Events.Count().ToString())
    
               if (slice.IsEndOfStream) 
               then
                  yield slice
               else
                  yield slice // here
                  yield! loop (startFrom + 1 * size)
           }
        loop startFrom
    

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 1970-01-01
      • 2014-08-14
      • 2016-10-12
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多