【问题标题】:Extract element from one list with elements from another list, recursively递归地从一个列表中提取元素与另一个列表中的元素
【发布时间】:2020-01-17 01:13:10
【问题描述】:

我想使用一个列表,例如[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

【问题讨论】:

    标签: list haskell recursion


    【解决方案1】:

    您可以在此处对列表中的每个元素应用相同的函数,这就是 map 的用途。

    假设你有:

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

    你需要做的是

    map (values!!) indexes
    

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

    如果您想以一种从代码中实际可见的方式递归地执行此操作,您可以这样做:

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

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

    【讨论】:

    • 你不需要第二行obtainValues [x]...。当您模式匹配 [](x:xs) 时,您已经匹配了列表的所有构造函数。
    • 如何将此获取值与其他函数的结果集成呢?我有一个函数,它需要一个三元组并输出一个列表。像这样:portInfoX (3, 1, 20) = [0, 2, 5, 4, 6]。但是当我把它放进去时,我到处都是类型错误。
    • 我不确定您在哪里使用了获取值。该函数的结果,即一个列表,可以用作obtainValues 中的参数,但您不能使用元组。您可能应该为此打开一个新问题。
    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多