Haskell,获取一个对(value,index)的列表,并将其作为一个列表[Int]



我是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

注意,当我们递归时,我们还需要了解如何处理输入列表。我将把这件事留给你。

最新更新