无限斐波那契数列

is7s

我正在尝试使用序列模仿Haskell在F#中著名的无限斐波那契列表。为什么以下序列未按预期进行评估?如何评估?

let rec fibs = lazy (Seq.append 
                        (Seq.ofList [0;1]) 
                        ((Seq.map2 (+) (fibs.Force()) 
                                       (Seq.skip 1 (fibs.Force())))))
v

问题在于您的代码仍然不够懒惰:Seq.append要访问的参数要在访问结果之前先进行评估,但是评估第二个参数(Seq.map2 ...)需要评估其自己的参数,这将强制定义相同的惰性值。可以通过使用该Seq.delay函数来解决。您也可以放弃lazy包装器,而lists已经seq是s,因此您不需要Seq.ofList

let rec fibs = 
    Seq.append [0;1]
        (Seq.delay (fun () -> Seq.map2 (+) fibs (Seq.skip 1 fibs)))

但是,我个人建议使用序列表达式,我觉得它更易于阅读(更容易正确编写):

let rec fibs = seq {
    yield 0
    yield 1
    yield! Seq.map2 (+) fibs (fibs |> Seq.skip 1)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章