通过从模式列表中添加整数,在Haskell中生成整数列表

问题描述 投票:3回答:4

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

问题:

假设我们要使用一个起始值和一个Ints列表生成一个Ints列表,它们表示要按指定顺序添加的数字的模式。因此,给出了第一个值,然后第二个值应该是起始值加上列表中的第一个值,第三个例如:假设我们有一个起始值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解决方案(几乎总是这样!)。你怎么看?也许很酷的列表理解?我忘记了一个高阶函数?

我正在和Haskell玩耍,主要是尝试学习一些新技术来解决问题。在没有任何实际应用程序考虑的情况下,我开始考虑一件有趣的事情,我找不到令人满意的...

list haskell sum cycle infinite
4个回答
1
投票
分开关注点。首先,仅查看要处理的列表。使它正常工作,对其进行测试。提示:“通常使用一些累加器遍历列表元素”非常适合折叠。

0
投票

0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.