Миранда просматривает списки
Есть ли простой способ пройти через список? Допустим, я хотел получить доступ к 5-м данным в списке, не зная, что это был B
["A","A","A","A","B","A","A","A","A"]
Есть ли способ, которым я могу сделать это без необходимости перебирать список?
4 ответа
Я не знаю Миранду так хорошо, но я ожидаю функции skip
а также take
доступны.
Вы можете обратиться к 5-му элементу, сделав функцию из skip and take. Когда пропустить и взять не доступны, их легко создать самостоятельно.
skip: пропускает число y элементов в списке, если y больше, чем количество элементов в списке, он вернет пустой список
take: занимает первое y количество элементов в списке, когда y больше, чем количество элементов в списке, будет возвращен полный список.
skip y [] = []
skip 0 xs = xs
skip y (x:xs) = skip xs (y-1)
take y [] = []
take 0 xs = []
take y (x:xs) = x : take (y-1) xs
elementAt x xs = take 1 (skip x xs)
Еще один способ сделать это - использовать! оператор. Допустим, у вас есть программа с определенными данными в списке, например:
plist = [A,A,A,A,B,A,A,A,A]
затем выполняет plist!4
даст вам 5-й элемент этого списка. (4 - 5-я единица, если вы включаете 0,1,2,3,4)
Так plist!4
возвращает Б.
Списки являются индуктивными типами данных. Это означает, что функции, определенные в списках - например, доступ к n-му элементу - определяются рекурсией. Структура данных, которую вы ищете, выглядит как массив, который позволяет осуществлять поиск в постоянном времени. Самый простой способ найти элемент по индексу в списке - это напрямую:
lookup :: Int -> [a] -> Maybe [a]
lookup n [] = Nothing
lookup 0 (x:xs) = Just x
lookup n (x:xs) = lookup (n - 1) xs
Списки - это не массивы.
Вы можете получить доступ только к элементам, начиная с первого. Думайте о списках как о потоках (например, о песне, играющей по радио). Списки могут быть бесконечными (так как радио никогда не останавливается).
Большинство программистов используют «синтаксический» сахар, который скрывает природу списков за более простым синтаксисом.
Миранда автоматически загружает библиотеку по умолчанию под названием «stdenv.m», которую вы можете изучить.
Теперь давайте подумаем о вашей проблеме: вы хотите игнорировать («отбрасывать») все элементы до 5-го, а затем получить первый элемент из оставшегося списка.
Это выражается в Миранде как:
nth :: num -> [*] -> *nth n = hd. падение (n-1)
Это функция с явным объявлением типа, чтобы убедиться, что эта функция работает с каждым списком (элементы имеют тип подстановки «*»).
Образец:
plist :: [[char]]plist = ["A","A","A","A","B","A","A","A","A"]
result :: [char]result = nth 5 plist
Если вы хотите закодировать свои функции с обработкой ошибок, вам нужны методы, чтобы обнаружить, что в вашем списке нет 5-го элемента.
Как видно выше, одна из техник - «Может быть». Другое - продолжения.
Плохой метод - сначала проверить длину списка, потому что это приведет к сбою с бесконечными списками.
Ваше здоровье