2016-09-10 1 views
0

Следующий код работает для 2 карточек колоды и отображает декартовую плоскость, так что дубликатов нет.Картезианская плоскость для 3-х карт и 4-х карт колоды в Haskell

allcards = [minBound..maxBound] :: [Card] 
    cartesianplane=[ [x ,y] | x <- allcards, y <- allcards, x < y ] 

Как я могу сделать то же самое для 3-х карт и 4 карт, чтобы дубликатов не было.

+1

Изменение минимального количества структуры кода, '[[х, у, г] | x <- allcards, y <- allcards, z <- allcards, x Mephy

+0

Существуют десятки примеров вопросов о генераторных наборах и комбинациях списка, если вы используете функцию поиска – jberryman

ответ

1

Вот способ рекурсивно сгенерировать наборы:

-- an example set of cards: 
data Card = A | T | J | Q | K 
    deriving (Show, Read, Eq, Ord, Bounded, Enum) 

next intv a 
    | a == maxBound = [] 
    | otherwise  = intv (succ a) 

interval a = [ a .. ] 
interval2 a = [ [x,y] | x <- interval a, y <- next interval x ] 
interval3 a = [ x:y | x <- interval a, y <- next interval2 x ] 
interval4 a = [ x:y | x <- interval a, y <- next interval3 x ] 
interval5 a = [ x:y | x <- interval a, y <- next interval4 x ] 

.:

например
interval A = [A,T,J,Q,K] 
interval2 A = [[A,T],[A,J],[A,Q],[A,K],[T,J],[T,Q],[T,K],[J,Q],[J,K],[Q,K]] 
interval3 A = [[A,T,J],[A,T,Q],[A,T,K],[A,J,Q],[A,J,K],[A,Q,K],[T,J,Q],[T,J,K],[T,Q,K],[J,Q,K]] 
interval4 A = [[A,T,J,Q],[A,T,J,K],[A,T,Q,K],[A,J,Q,K],[T,J,Q,K]] 
interval5 A = [[A,T,J,Q,K]] 
Смежные вопросы