我需要为我的编程课解决这个分配的问题。
您需要实现一个函数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]
,则输出应等于自定义错误字符串...例如,“输入索引超出范围”
答案 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 lst1
从Data.List
调用elem函数,以检查列表中是否存在值。该第三块期望一个布尔值,并且对于每个从取值表达式中获取的值,对另一个块进行一次评估。在这种情况下,仅当True
中存在值i
(我们的索引)时,它的评估结果为lst1
。答案 1 :(得分:0)
这是一个非常简单的解决方案。为了不完全破坏您的家庭作业,自定义错误部分留给读者练习。
subList lst1 lst2 = map (lst2 !!) lst1
map
将函数应用于列表的所有元素,并将结果返回到新列表中,而!!
从列表中的给定索引处获取一个元素。