一种函数,它基于索引的第一列表从第二列表中获取相应的元素

时间:2019-04-22 07:23:32

标签: list haskell

我需要为我的编程课解决这个分配的问题。

  

您需要实现一个函数subList,以便它根据索引的第一个列表从第二个列表中获取相应的元素。

例如,如果输入为subList [0,3,4] [1,2,3,4,5,6,7,8],则答案应为[1,4,5]

subList :: [Int] -> [Int] -> [Int]
subList lst1 lst2

总体而言,我对编程非常陌生,所以这就是我到目前为止所拥有的...

如果两个列表中没有相似的元素,我还需要一个错误函数。例如,输入= {[0,9][1,2,3],则输出应等于自定义错误字符串...例如,“输入索引超出范围”

2 个答案:

答案 0 :(得分:3)

您可以使用列表理解:

Prelude> let subList lst1 lst2 = [x | (i, x) <- zip [0..] lst2, i `elem` lst1]
Prelude> subList [0,3,4] [1,2,3,4,5,6,7,8]
[1,4,5]

让代码分析一下。 我们希望第二个列表x中存在所有值lst2,其索引i出现在另一个列表lst1中。

在理解方面,我们有三个主要方面:

  • |之前,我们将为每个“迭代”捕获值(我们希望x将是lst2中存在的值)
  • 第二个块是我们声明将从中获取值的位置。
    • 在这种情况下,我们需要这些值及其索引。借助此zip [0..] lst2,我们将建立一个元组列表,其中元组的第一个值是索引,第二个值是从lst2中获取的值(类似于[(0, 1), (1, 2)...])。
    • 然后我们将它们一对一地对待,并用(i, x) <- ...模式匹配那些元组,其中i将是每个索引,而x将是前面解释的那些元组中的每个值。
  • 最后一个块i elem lst1Data.List调用elem函数,以检查列表中是否存在值。该第三块期望一个布尔值,并且对于每个从取值表达式中获取的值,对另一个块进行一次评估。在这种情况下,仅当True中存在值i(我们的索引)时,它的评估结果为lst1

答案 1 :(得分:0)

这是一个非常简单的解决方案。为了不完全破坏您的家庭作业,自定义错误部分留给读者练习。

subList lst1 lst2 = map (lst2 !!) lst1

map将函数应用于列表的所有元素,并将结果返回到新列表中,而!!从列表中的给定索引处获取一个元素。