gpt4 book ai didi

haskell - 延迟计算谐波函数

转载 作者:行者123 更新时间:2023-12-02 02:38:53 24 4
gpt4 key购买 nike

我正在阅读一本Haskell书,其中其中一项练习要求懒惰地计算谐波函数,我提供了这种解决方案,我认为这很懒:

harmonic n = sum l
where l = take n (map (1/) [1..])

但是书上的答案似乎要复杂得多:

harmonic n = sum (take n seriesValues)
where seriesPairs = zip (cycle [1.0]) [1.0,2.0 .. ]
seriesValues = map
(\pair -> (fst pair)/(snd pair))
seriesPairs

哪一个使我相信我的方法实际上不是偷懒,而是怎么做?我在那里处理无限列表。

最佳答案

我的意思是您可以对它进行基准测试,但是我没有很高的期望。这本书的措词看起来很尴尬。做一些方程式重构让我大叫

seriesPairs = zip (cycle [1.0]) [1.0,2.0 .. ]
seriesPairs = zip (cycle [1]) [1,2..] -- trust type inference
seriesPairs = map (1,) [1,2..] -- unnecessary zip of repeat list


seriesValues = map (\pair -> (fst pair)/(snd pair)) seriesPairs
seriesValues = map (\(a,b) -> a/b) seriesPairs -- pattern matching!

seriesValues = map (\(a,b) -> a/b) (map (1,) [1,2..])
seriesValues = map ((\(a,b) -> a/b) . (1,)) [1,2..] -- map fusion
seriesValues = map (\b -> 1/b) [1,2..]
seriesValues = map (1/) [1..]


harmonic n = sum (take n seriesValues)
harmonic n = sum (take n (map (1/) [1..]))

看起来熟悉?我相信所有这些转换都可用于优化器,因此,如果您使用优化进行编译,我希望它们能够执行相同的操作。不过不要拘束我。但是从命名上来说,它们是相同的程序。在我看来,作者对Haskell的语言不是很流利(特别是 (\pair -> (fst pair)/(snd pair))行具有很浓的重音)。

我不会把这两个函数都称为惰性函数。实际上,如果它需要一个 Int参数和一个 Double结果,则我将称为“惰性”的唯一函数是常量函数。

这就是我所说的懒惰:计算谐波数的无限列表,重新使用中间结果。
harmonicNumbers :: [Double]
harmonicNumbers = scanl (+) 0 (map (1/) [1..])

关于haskell - 延迟计算谐波函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61473630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com