递归地从一个列表中提取元素与另一个列表中的元素

时间:2018-06-23 22:51:30

标签: list haskell recursion

我想使用一个列表,例如[1、2、4]从另一个列表中获取元素,例如[1、0、2、5、1、0]使用递归,因此结果存储在第三列表中。好像第一个列表表示第二个列表中所需的每个元素的位置,就像这样:

[1, 0, 2, 5, 1, 0]!!1 = 1
[1, 0, 2, 5, 1, 0]!!2 = 0
[1, 0, 2, 5, 1, 0]!!4 = 5

我该怎么做?我知道上面的结果应该分别为0、2和1,但这很容易解决。

1 个答案:

答案 0 :(得分:1)

您可以在这里为列表中的每个元素应用相同的功能,这就是map的作用。

假设您拥有:

indexes = [1, 2, 4] 
values = [1, 0, 2, 5, 1, 0]

您需要做的是

map (values!!) indexes

这将返回所需的[0,2,1]。您正在使用部分应用程序对values!!index列表中的每个值执行indexes,然后将其保存到与indexes长度相同的列表中。 / p>

如果您想以一种在代码中实际可见的方式递归地执行此操作,则可以执行以下操作:

obtainValues [] values = []
obtainValues (x:xs) values = [values !! x] ++ (obtainValues xs values)

请注意(x:xs)中的模式匹配,其中x是列表的第一个元素(在这种情况下,假设为Int),而xs表示列表的其余部分([Int])。