我是Haskell的新手,一直在努力解决这个问题。我一直在尝试取一个配对列表,并将其压缩为一个单一列表
例如,如果我有对:
[(2,0),(4,5),(3,10)]
列表应返回
[2,0,0,0,0,4,0,0,0,0,3]
其思想是,该对的第一个元素是值,第二个值是索引。以下是我迄今为止所尝试的:
finalList :: [(Int,Int)] -> [Int]
finalList ((x,y): xs) = replicate y 0 ++ [x] ++ finalList xs
finalList _ = []
然而,对于这个问题,我没有得到我想要的0的填充。相反,我得到了这样的东西:[6,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,12]
如有任何帮助,我们将不胜感激!谢谢
我将提供一个提示。我还将假设输入列表中的索引是按递增顺序排列的。
一种可能的方法是首先定义一个多取一个参数的辅助函数;索引";计算到目前为止我们已经生产了多少元素。以下是您可能使用的部分代码的草图。
f :: [(Int,Int)] -> Int -> [Int]
f [] _ = ... -- base case
f ((value, pos):xs) ix
| ix == pos = value : ... -- here we recurse
| otherwise = 0 : ... -- here we recurse too
粗略地说,上面的逻辑是:跟踪当前位置ix
:如果该位置是想要的位置pos
,则发射value
。否则发射0
作为填充物。
在这两种情况下,我们都会递归,并且我们需要增加当前位置ix
。当前位置is
将初始设置为零,如下所示:
finalList :: [(Int,Int)] -> [Int]
finalList xs = f xs 0
注意,当我们递归时,我们还需要了解如何处理输入列表。我将把这件事留给你。