Функция, которая берет соответствующие элементы из второго списка на основе первых списков индексов - PullRequest
0 голосов
/ 22 апреля 2019

Мне нужна помощь в решении этой задачи для моего класса программирования.

Вам необходимо реализовать функцию subList так, чтобы она брала соответствующие элементы из второго списка на основе первых списков индексов.

Например, если ввод subList [0,3,4] [1,2,3,4,5,6,7,8], ответ должен быть [1,4,5]

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

Я очень новичок в программировании в целом, так что это все, что у меня есть ...

Мне также нужна функция ошибки, если в обоих списках нет похожих элементов. например, input = [0,9] и [1,2,3], выходные данные должны быть равны пользовательской строке ошибки ... например, "Входной индекс выходит за границы"

Ответы [ 2 ]

3 голосов
/ 22 апреля 2019

Вы можете использовать понимание списка:

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)
  • Второй блок, где мы объявляем, откуда мы будем принимать значения.
    • В этом случае нам нужны значения и их indexex. С помощью этого zip [0..] lst2 мы создаем список кортежей, где первое значение кортежей - это индексы, а вторые значения - это значения, взятые из lst2 (что-то вроде [(0, 1), (1, 2)...]).
    • Затем мы берем их один за другим и сопоставляем шаблон с этими кортежами: (i, x) <- ..., где i будет каждым из индексов, а x - каждое из значений в этих кортежах, объясненных ранее.
  • Последний блок, i elem lst1 вызывает функцию elem из Data.List, которая проверяет, присутствует ли значение в списке. Этот третий блок ожидает логическое значение, и, как и другой, оценивается один раз для каждого взятого значения из выражения в понимании. В этом случае значение будет True только тогда, когда значение i (наши индексы) присутствует в lst1.
0 голосов
/ 23 апреля 2019

Вот очень простое решение. Чтобы не полностью испортить домашнее задание, пользовательский фрагмент ошибок оставлен читателю в качестве упражнения.

subList lst1 lst2 = map (lst2 !!) lst1

map применяет функцию ко всем элементам списка, возвращая результаты в новом списке, а !! получает элемент из списка по заданному индексу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...