Haskell,获取一个对列表(值,索引)并使其成为一个列表[Int]

lsmd5eda  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(153)

我是Haskell的新手,一直在尝试解决这个问题。我一直在尝试把一个成对的列表压缩成一个列表
例如,如果我有两个对子:

[(2,0),(4,5),(3,10)]

列表应返回

[2,0,0,0,0,4,0,0,0,0,3]

这个方法的思想是,第一个元素是value,第二个元素是index。下面是我目前所做的尝试:

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]
任何帮助将不胜感激!谢谢!

h7wcgrx3

h7wcgrx31#

我将提供一个提示。我还将假设输入列表中的索引是按升序排列的。
一种可能的方法是首先定义一个辅助函数,它带有一个参数,一个“索引”,用来计算到目前为止我们已经生成了多少个元素。

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

注意,当我们递归时,我们还需要了解如何处理输入列表,这一点我将留给您。

相关问题