gpt4 book ai didi

list - 通过从模式列表中添加 Ints 在 Haskell 中生成 Ints 列表

转载 作者:行者123 更新时间:2023-12-02 02:57:48 25 4
gpt4 key购买 nike

我在玩 Haskell,主要是想学习一些新技术来解决问题。在没有考虑任何实际应用的情况下,我开始思考一件有趣的事情,但我找不到令人满意的解决方案。也许有人有更好的想法?

问题:

假设我们要使用一个起始值和一个 Int 列表生成一个 Int 列表,表示要按指定顺序添加的数字模式。所以第一个值是给定的,那么第二个值应该是起始值加上列表中的第一个值,第三个 that 值加上模式的第二个值,以此类推。当模式结束时,它应该重新开始。

例如:假设我们有一个起始值 v 和一个模式 [x,y],我们想要列表 [v,v+ x,v+x+y,v+2x+y,v+2x+2y, ...]。换句话说,对于双值模式,下一个值是通过将 xy 交替添加到最后计算的数字来创建的。

如果模式足够短(2-3 个值?),可以生成单独的列表:

  • [v,v,v,...]
  • [0,x,x,2x,2x,3x, ...]
  • [0,0,y,y,2y,2y,...]

然后将它们压缩在一起并添加。但是,只要模式更长,这就会变得非常乏味。我对解决方案的最佳尝试是这样的:

generateLstByPattern :: Int -> [Int] -> [Int]
generateLstByPattern v pattern = v : (recGen v pattern)
where
recGen :: Int -> [Int] -> [Int]
recGen lastN (x:[]) = (lastN + x) : (recGen (lastN + x) pattern)
recGen lastN (x:xs) = (lastN + x) : (recGen (lastN + x) xs)

它按预期工作 - 但我觉得某处有更优雅的 Haskell 解决方案(几乎总是有!)。你怎么看?也许是一个很酷的列表理解?一个我忘记的高阶函数?

最佳答案

分离关注点。首先看一个列表来处理一次。让它工作,测试它。提示:“使用一些累加器遍历列表元素”通常非常适合折叠。

剩下的就是重复输入列表并将其输入到 pass-once 函数中。方便的话,有a standard function为了这个目的。只需确保您的一次性处理器足够懒惰以处理无限列表输入。

关于list - 通过从模式列表中添加 Ints 在 Haskell 中生成 Ints 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62176795/

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