F#中更简单的Seq.unfold

时间:2012-08-09 11:12:08

标签: f# sequences seq

是否有一个更简单的Seq.unfold版本只将前一个元素作为状态?我知道你可以轻松地调整Seq.unfold来做到这一点,但结果不是很易读。

2 个答案:

答案 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 -> ()
  }