有没有更简单的Seq.unfold版本,它只接受前一个元素作为状态?我知道你可以很容易地修改Seq.unfold来做这件事,但是结果不是很好读。
发布于 2012-08-09 20:14:09
我不认为有一个内置的函数可以做到这一点。
使用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-09 22:22:34
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 -> ()
}https://stackoverflow.com/questions/11882140
复制相似问题