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
让开
|无->()
}