Самый простой способ изменить порядок пунктов в списке вашего понимания:
deck = [Card su val | su <- [Club .. Spade], val <- [Two .. Ace]]
Почему это работает? Концептуально, понимание списка с двумя входами (su
и val
в этом случае) работает следующим образом: во-первых, выберите элемент первого ввода; затем, используя этот, выберите каждый элемент второго ввода. Поэтому, когда у вас есть su
первый и val
секунд, он сначала выбирает костюм, а затем генерирует каждую карту в этом костюме; в вашей версии он сначала выбирает значение и генерирует четыре карты с этим значением.
Теперь, когда у вас есть карточки в правильном порядке, вам нужно выяснить, как превратить их в строку. Для этого вам нужно написать хорошую функцию Card -> String
. Функция должна распаковать Card
:
showCard (Card suit value) = ...
Оттуда вам нужно повернуть suit
и value
в строки (возможно, с использованием функции show
) и объединить их в одном предложении.
После того, как у вас есть такая функция, у вас есть два варианта. Вы можете просто map
функция за deck
: map showCard deck
. Вы также можете интегрировать его непосредственно в списке понимание:
deck = [showCard (Card su val) | su <- [Club .. Spade], val <- [Two .. Ace]]
Это эквивалентно использованию map
.
Это будет длинный список строк, описывающих карты в правильном порядке. Если вы хотите превратить его в одну строку, вы можете использовать функцию unwords
. unwords
берет список строк и помещает их вместе в виде пробелов - он рассматривает его как список «слов» и собирает эти слова в одну строку.
Как выглядит ваш код до сих пор, или вы просто пытаетесь определить типы? –
В чем вопрос? То, что ты выглядишь прекрасно для меня. Вам просто нужно создать функцию 'describeCard :: Deck -> String' (или вывести' Show', альтернативно), чтобы вы могли превратить значения 'Card' в' String'. – tom
Том, вот в чем проблема - я не знаю, как это сделать. – Warditive