gpt4 book ai didi

list - Haskell — 从无限列表中获取多个值,而无需重新开始列表

转载 作者:行者123 更新时间:2023-12-04 23:25:22 24 4
gpt4 key购买 nike

我目前正在实现 Project Euler problem 40并且我试图弄清楚如何从 Haskell 中的列表中获取多个项目,而无需重新开始列表。

目前,我有一个列表 champernowne类型 Integral a => [a]这将返回Champernowne 常数数字的无限列表,然后我从这个序列中取出第一个、第十个等项并将它们相乘得到答案。实际代码是:

ans = (product . map (champernowne !!)) [0, 9, 99, 999, 9999, 99999]

这个实现的问题是(我假设)Haskell 每次想要获得一个新术语时都会从序列的开头遍历列表。我怎样才能让 haskell 只遍历从元素 1 到 1 000 000 的序列,然后将这些术语从中间拉出来?我已经尝试过 scanl 希望懒惰的评估能帮助我,但它没有:
ans = (product . head . scanl (flip drop) champernowne) [10, 90, 900, 9000, 90000]

只是为了澄清,第一部分代码确实有效,但我正在尝试改进我的实现以提高效率。

最佳答案

解决该问题的有效方法是在不构建列表的情况下计算数字。

但是如果你想要的索引是按升序给出的,你可以通过计算相对偏移量和 drop 来获得它,而无需从每个索引的前面开始。 ping 适当数量的项目以达到下一个所需的索引

-- supposes the list of indices in ascending order
indices :: [a] -> [Int] -> [a]
indices xs is = go xs offsets
where
offsets = zipWith (-) is (0:is)
go ys (k:ks) = case drop k ys of
z:zs -> z : go (z:zs) ks
_ -> []
go _ [] = []

关于list - Haskell — 从无限列表中获取多个值,而无需重新开始列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025941/

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