是否有一个更简单的Seq.unfold
版本只将前一个元素作为状态?我知道你可以轻松地调整Seq.unfold
来做到这一点,但结果不是很易读。
答案 0 :(得分:3)
我认为没有内置功能可以做到这一点。
使用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) }
这种行为略有不同,因为它也会产生第一个值。不确定你想要什么行为。
答案 1 :(得分:1)
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 -> ()
}