2015-11-04 2 views
2

У меня есть функция в Haskell, которая возвращает мне преемника карты. Я знаю, как получить доступ к карточке, используя понимание списка, но не совсем уверен, как получить следующую карту, поэтому pos + 1. Вот мой код:Следующий элемент в списке

pCard::Card->Deck->Card 
pCard (K,C) _ = (A,S) --exception for last card 
pCard crd pck = head [p|(pos,p)<-(zip [0..51] pck),crd==p] 

ответ

3

Подсказка: используйте dropWhile (/= crd) pck, чтобы удалить все карты с самого начала, пока ваша карта не найдена. Затем первая оставшаяся карта равна crd. Один после этого тот, который вы хотите.

Тем не менее, если pck - это колода в , стандартный заказ, перевернув всю колоду, чтобы найти следующую карту, кажется, неэффективен.

+0

Как насчет поиска предшественника. Это сработало! –

+0

Сделайте копию. 'last $ takeWhile (/ = crd) pck' – karakfa

3

Вы можете сделать вам свой Card тип экземпляр в Enum по deriving Enum классу типов, а затем использовать функцию succ, чтобы получить преемник карту. Обратите внимание, что передача последней карты колоды в succ приведет к ошибке во время выполнения, хотя, похоже, ваш первый корпус pCard будет учитывать это.

Я только что заметил, что ваш тип Card выглядит как кортеж; Я предполагаю, что вы определили Card, используя ключевое слово ? В этом случае предложенное мной решение не будет работать без использования расширений GHC.