F# 更简单的顺序在F中展开#
是否有一个更简单的F# 更简单的顺序在F中展开#,f#,sequences,seq,F#,Sequences,Seq,是否有一个更简单的Seq.unfold版本,只将前一个元素作为状态?我知道您可以很容易地调整Seq.unfold来实现这一点,但结果不是很可读。我认为没有内置函数可以做到这一点 使用Seq.unfold重复相同的模式会很烦人,但您可以轻松地使用unfold定义一个功能,该功能的行为符合您的需要,然后只使用新功能: module Seq = let generate f v = Seq.unfold (fun v -> let r = f v in Some(r, r)) v
Seq.unfold
版本,只将前一个元素作为状态?我知道您可以很容易地调整Seq.unfold
来实现这一点,但结果不是很可读。我认为没有内置函数可以做到这一点
使用Seq.unfold
重复相同的模式会很烦人,但您可以轻松地使用unfold
定义一个功能,该功能的行为符合您的需要,然后只使用新功能:
module Seq =
let generate f v =
Seq.unfold (fun v -> let r = f v in Some(r, r)) v
另外,如果我想实现该模式,我可能会使用一个简单的递归序列表达式,它可能比使用Seq.unfold
更容易阅读。generate
功能可以如下实现:
let rec generate f v = seq {
yield v
yield! generate f (f v) }
它的行为有点不同,因为它也会产生第一个值。不确定您想要什么样的行为。我认为没有内置函数可以做到这一点 使用
Seq.unfold
重复相同的模式会很烦人,但您可以轻松地使用unfold
定义一个功能,该功能的行为符合您的需要,然后只使用新功能:
module Seq =
let generate f v =
Seq.unfold (fun v -> let r = f v in Some(r, r)) v
另外,如果我想实现该模式,我可能会使用一个简单的递归序列表达式,它可能比使用Seq.unfold
更容易阅读。generate
功能可以如下实现:
let rec generate f v = seq {
yield v
yield! generate f (f v) }
它的行为有点不同,因为它也会产生第一个值。不确定您想要什么行为。托马斯的回答很好,但是,正如您所说,使用
Seq.unfold
来执行此操作很难看,正如他所说,他的generate
函数的行为不同
如果您想要与序列展开
相同的行为,但使用上一个元素作为状态,则应该这样做:
让rec展开f状态=
序号{
将f状态与
|一些x->
产量x
让开
|无->()
}
Tomas的答案很好,但正如您所说,使用Seq.unfold
来执行此操作很难看,正如他所说,他的生成
函数的行为不同
如果您想要与序列展开
相同的行为,但使用上一个元素作为状态,则应该这样做:
让rec展开f状态=
序号{
将f状态与
|一些x->
产量x
让开
|无->()
}