【发布时间】:2012-08-09 11:12:08
【问题描述】:
有没有更简单的Seq.unfold 版本,它只将前一个元素作为状态?我知道你可以很容易地调整 Seq.unfold 来做到这一点,但结果不是很可读。
【问题讨论】:
有没有更简单的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) }
这有点不同,因为它也产生第一个值。不确定你想要什么行为。
【讨论】:
Tomas 的回答很好,但是就像你说的那样,使用 Seq.unfold 来做到这一点很丑,而且,正如他所说,他的 generate 函数的行为不同。
如果您想要与Seq.unfold 相同的行为,但使用前一个元素作为状态,应该这样做:
let rec unfold f state =
seq {
match f state with
| Some x ->
yield x
yield! unfold f x
| None -> ()
}
【讨论】: