Rob*_*iff 3 .net architecture f# design-patterns seq
作为使用策略模式的项目的一部分,我正在尝试编写一个函数,它创建一个函数,每次应用时返回无限序列的下一个值.目前我正在使用这个狡猾的GetNext函数:
let GetNext<'T> (enumerator:System.Collections.Generic.IEnumerator<'T>) =
    let n = enumerator.MoveNext()
    enumerator.Current
let FunctionFactory<'T> =
    let s = 0.0 |> Seq.unfold (fun i -> Some(i, if 0.0 = i then 1.0 else 0.0))
    let enumerator = s.GetEnumerator()
    (fun (ignoredParam:'T) -> GetNext enumerator )
我希望FunctionFactory看起来像这样:
let FunctionFactory<'T> =
    let s = 0.0 |> Seq.unfold (fun i -> Some(i, if 0.0 = i then 1.0 else 0.0))
    (fun (ignoredParam:'T) -> Seq.next s )
该ignoredParam在穿过相同的策略模式和依赖于它提供上下文其他功能中使用.由于这看起来很糟糕,我真的有两个问题.为什么没有Seq.next?实现各种可以注入这样的策略框架的序列表达式的正确/优雅方法是什么?
按照Fyodor Soikin的回答编辑 - 目前顺序表达对我很有吸引力,因为它们帮助我思考我正在看的问题.我想用更复杂的输入序列构建这种模式,而不是可变的命令式样式代码.
您是否注意到您从未处置过调查员?这就是为什么没有Seq.next:它的使用需要不合理的设计.
至于第二个问题,你想要实现的"这个"是什么并不完全清楚.就我可以从代码中收集而言,你正试图产生一个"有状态的程序",它将产生1.0或0.0,每次调用时都会切换.对?
如果是这样,我会通过可变值来实现.比序列少得多的开销:
let FunctionFactory<'T> =
    let mutable flag = true
    fun (_:'T) -> 
       flag <- not flag
       if flag then 1.0 else 0.0