我正在和Haskell玩耍,主要是尝试学习一些新技术来解决问题。在没有任何实际应用程序考虑的情况下,我开始考虑一件有趣的事情,但我找不到令人满意的解决方案。也许有人有更好的主意?
问题:
假设我们要使用一个起始值和一个Ints列表生成一个Ints列表,它们表示要按指定顺序添加的数字的模式。因此,给出了第一个值,然后第二个值应该是起始值加上列表中的第一个值,第三个v
和一个模式[x,y]
,我们想要列表[v,v+x,v+x+y,v+2x+y,v+2x+2y, ...]
。换句话说,对于二值模式,通过将x
和y
交替添加到最后计算的数字来创建下一个值。
如果模式足够短(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玩耍,主要是尝试学习一些新技术来解决问题。在没有任何实际应用程序考虑的情况下,我开始考虑一件有趣的事情,我找不到令人满意的...