【发布时间】:2015-10-12 22:59:09
【问题描述】:
作为使用策略模式的项目的一部分,我正在尝试编写一个函数,该函数创建一个函数,该函数在每次应用时返回无限序列的下一个值。目前我正在使用这个狡猾的 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 的回答编辑 - 序列表达式目前对我很有吸引力,因为它们帮助我思考我正在研究的问题。而不是可变的命令式代码,我想在这个模式上构建更复杂的输入序列。
【问题讨论】:
标签: .net design-patterns architecture f# seq