用另一个列表 Haskell 中的元素替换元素列表

问题描述

我有点难以解释标题的确切含义。我想在 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)

解决方法

您非常接近确切的解决方案。基本上有两个问题:

  1. 你想返回一个列表列表。因此返回类型是 [[a]],并且该列表的元素是列表,因此 y:xs 是一个 元素,而不是一个子列表;所以你用 :y:xs 和它的尾巴结合起来;和

  2. 对于其余元素,您在所有子列表前面加上 x,这意味着您执行 mapping:

如果我们解决这两个问题,我们得到:

replace' :: [a] -> [a] -> [[a]]
replace' [] _ = []
replace' _ [] = []
replace' (x:xs) (y:ys) = (y:xs) : map (x:) (replace' xs ys)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...