2013-03-23 1 views
-1

Я ищу способ, чтобы перечислить все 52 карт в колоде не содержит как строки в определенном порядке:Листинг 52 карты колодой в установленном порядке строк - Haskell

Ace of Clubs, Two of Clubs ... Jack of Clubs с последующим Ace of Diamonds ... Jack of Diamonds и так далее до тех пор, Ace of Spades ... Jack of Spades.

Я хотел бы предложил модификацию следующей схеме:

type Deck = [Card] 

deck::Deck 
deck = [Card val su | val <- [Two .. Ace], su <- [Club .. Spade]] 

Источник: http://www.haskell.org/haskellwiki/Type

+0

Как выглядит ваш код до сих пор, или вы просто пытаетесь определить типы? –

+0

В чем вопрос? То, что ты выглядишь прекрасно для меня. Вам просто нужно создать функцию 'describeCard :: Deck -> String' (или вывести' Show', альтернативно), чтобы вы могли превратить значения 'Card' в' String'. – tom

+0

Том, вот в чем проблема - я не знаю, как это сделать. – Warditive

ответ

1

Самый простой способ изменить порядок пунктов в списке вашего понимания:

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 берет список строк и помещает их вместе в виде пробелов - он рассматривает его как список «слов» и собирает эти слова в одну строку.

+0

Выход должен быть в форме + "of" + + "s". Это то, что я ищу. – Warditive

+0

Вы можете определить 'showCard' в терминах меньших функций' showSuit' и 'showValue'. Используйте сопоставление шаблонов в этих функциях, например: http://learnyouahaskell.com/syntax-in-functions – kputnam

+0

Спасибо всем за ваши предложения, но теперь в выводе перечислены все возможные комбинации <сочетание со значениями> Ace, затем все Две комбинации и т. Д. Вместо этого мне нужно иметь форму <все возможные комбинации с костюмами> - «Туз клубов, два из клубов ...», а затем «Туз бриллиантов, два из бриллиантов» и т. Д. , Какие-либо предложения? – Warditive

0

Производить набор и ценность из шоу, и вам не нужно ничего переводить в строки. Я не беспокоился о типе карты, просто использую кортеж. Кажется, это дает то, что вы хотите.

данные Value = Ace | Два | Три | Четыре | Пять | Шесть | Семь | Восемь | Девять | Десять | Король | Королева | Джек выводе (Enum, шоу) данных Люкс = Клуб | Алмазный | Сердце | лопата выводе (Enum, шоу)

карта данных = Карта Значение Люкс вывод (Показать)

Декабрь = [(v, s) | s < - [Club .. Spade], v < - [Ace ..Jack]]

Смежные вопросы