Миранда просматривает списки - PullRequest
1 голос
/ 29 октября 2011

Есть ли простой способ просмотреть список? допустим, я хотел получить доступ к 5-м данным в списке, не зная, что это B

["A","A","A","A","B","A","A","A","A"]

Есть ли способ, которым я могу сделать это без необходимости перебирать список?

Ответы [ 3 ]

4 голосов
/ 29 октября 2011

Я не очень хорошо знаю Миранду, но я ожидаю, что функции skip и take доступны.

Вы можете обратиться к 5-му элементу, сделав функцию из skip and take.Когда 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)
2 голосов
/ 18 сентября 2013

Еще один способ сделать это - использовать!оператор.Допустим, у вас есть программа с определенными данными в списке, такими как:

plist = [A,A,A,A,B,A,A,A,A]

, затем выполнение plist!4 даст вам 5-й элемент этого списка.(4 - 5-я единица, если вы включите 0,1,2,3,4)

Итак, plist!4 возвращает B.

2 голосов
/ 29 октября 2011

Списки индуктивные типы данных.Это означает, что функции, определенные в списках - например, доступ к элементу nth - определяются рекурсией.Структура данных, которую вы ищете, выглядит как массив, который позволяет осуществлять поиск в постоянном времени.Самый простой способ найти элемент по индексу в списке - это напрямую:

lookup :: Int -> [a] -> Maybe [a]
lookup n []     = Nothing
lookup 0 (x:xs) = Just x
lookup n (x:xs) = lookup (n - 1) xs
...