2

有没有更简单的Seq.unfold版本,只将前一个元素作为状态?我知道你可以很容易地适应Seq.unfold这样做,但结果不是很可读。

4

2 回答 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 回答