问题描述
我有点难以解释标题的确切含义。我想在 Haskell 中创建一个函数,它接受两个列表并返回一个列表列表,其中每个列表是通过将第一个列表中的第 i 个元素替换为第二个列表中的第 i 个元素来获得的。例如,如果给定 [1,2,3] 和 [4,5,6],它应该返回 [[4,3],[1,6]]。 我尝试使用这个递归函数,它只返回一个包含所有值的列表,然后我可以将这些值分解并转换为列表列表,但它在途中丢失了一些元素。
replace' :: [a] -> [a] ->[a]
replace' _ [y] = [y]
replace' (x:xs) (y:ys) = y:xs ++ x: (replace' xs ys)
解决方法
您非常接近确切的解决方案。基本上有两个问题:
-
你想返回一个列表列表。因此返回类型是
[[a]]
,并且该列表的元素是列表,因此y:xs
是一个 元素,而不是一个子列表;所以你用:
把y:xs
和它的尾巴结合起来;和 -
对于其余元素,您在所有子列表前面加上
x
,这意味着您执行map
ping:
如果我们解决这两个问题,我们得到:
replace' :: [a] -> [a] -> [[a]]
replace' [] _ = []
replace' _ [] = []
replace' (x:xs) (y:ys) = (y:xs) : map (x:) (replace' xs ys)