有没有更简单的Seq.unfold
版本,只将前一个元素作为状态?我知道你可以很容易地适应Seq.unfold
这样做,但结果不是很可读。
问问题
648 次
2 回答
4
我认为没有内置函数可以做到这一点。
重复使用相同的模式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) }
这有点不同,因为它也产生第一个值。不确定你想要什么行为。
于 2012-08-09T12:14:08.620 回答
2
托马斯的回答很好,但就像你说的那样,Seq.unfold
这样做很丑,而且,正如他所说,他的generate
功能表现不同。
如果您想要与 相同的行为Seq.unfold
,但使用前一个元素作为状态,则应该这样做:
let rec unfold f state =
seq {
match f state with
| Some x ->
yield x
yield! unfold f x
| None -> ()
}
于 2012-08-09T14:22:33.737 回答