gpt4 book ai didi

.net - F# Seq.next - 正确的模式是什么?

转载 作者:行者123 更新时间:2023-12-01 01:39:33 24 4
gpt4 key购买 nike

作为使用策略模式的项目的一部分,我正在尝试编写一个函数,该函数创建一个函数,该函数在每次应用时返回无限序列的下一个值。目前我正在使用这个狡猾的 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?什么是正确/优雅的方式来实现可以注入(inject)到这样的策略框架中的各种序列表达式

根据 Fyodor Soikin 的回答进行编辑 - 序列表达式目前对我很有吸引力,因为它们可以帮助我思考我正在研究的问题。我不想使用可变的命令式代码,而是使用更复杂的输入序列构建此模式。

最佳答案

您是否注意到您从未处理过枚举器?这就是为什么没有 Seq.next 的原因:它的使用需要不合理的设计。

至于第二个问题,目前还不完全清楚您要实现的“this”是什么。据我从代码中收集到的信息,您正在尝试生成一个“有状态过程”,该过程将产生 1.0 或 0.0,每次调用时都会切换。对吧?

如果是这样,我会通过可变值来实现。比序列少很多开销:

let FunctionFactory<'T> =
let mutable flag = true
fun (_:'T) ->
flag <- not flag
if flag then 1.0 else 0.0

关于.net - F# Seq.next - 正确的模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33091526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com