【问题标题】:Simpler Seq.unfold in F#F# 中更简单的 Seq.unfold
【发布时间】:2012-08-09 11:12:08
【问题描述】:

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

【问题讨论】:

    标签: f# sequences seq


    【解决方案1】:

    我认为没有内置函数可以做到这一点。

    使用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) }
    

    这有点不同,因为它也产生第一个值。不确定你想要什么行为。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2010-10-06
        • 2020-09-11
        • 2017-05-13
        • 2012-09-01
        • 2011-05-28
        • 2010-11-14
        • 2017-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多