Como você classificar uma lista de tuplas por um dos tupla-Haskell

votos
-1

Eu tenho uma lista de cartões e quer lista de cartões ([cartão]) por ação, mas a maneira cartão é definido torna confuso para navegar classificar. Alguém pode me ajudar a definir uma função simples para ordenar a lista.

Tentei coisas como sortHand :: [cartão] -> [cartão] sortHand mão = mão tipo, mas não consigo descobrir como para filtrar apenas o terno

O cartão está definido: Terno de dados = Spade | clube | diamante | decorrentes coração (Eq, Ord, Enum, limitado)

Posto data = Dois | três | quatro | cinco | seis | sete | oito | nove | dez | Jack | Rainha | rei | Ás decorrentes (Eq, Ord, Enum, limitado)

Cartão de dados = terno do cartão do Posto derivando (Eq)

Publicado 24/10/2019 em 11:56
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Isso é fácil se você faz Cardum tipo de registro :

data Card = Card { cardSuit::Suit, cardRank::Rank }
  deriving (Eq)
*Main> :m +Data.List
*Main Data.List> :m +Data.Ord
*Main Data.List Data.Ord> sortBy (comparing cardSuit) [Card Club Three, Card Diamond Two, Card Spade Eight, Card Spade Five]
[Card {cardSuit = Spade, cardRank = Eight},Card {cardSuit = Spade, cardRank = Five},Card {cardSuit = Club, cardRank = Three},Card {cardSuit = Diamond, cardRank = Two}]
Respondeu 24/10/2019 em 14:41
fonte usuário

votos
3

Isto é o que os sortBy :: (a -> a -> Ordering) -> [a] -> [a]e comparing :: Ord b => (a -> b) -> (b -> b -> Ordering)funções são para. O primeiro permite que você classificar por uma ordenação personalizada, o outro permite definir uma ordenação por mapeamento aé a algum bque tem uma ordenação (um cartão de um terno, neste exemplo).

Você poderia usar estes em conjunto para definir

sortBySuit hand = sortBy (comparing $ \(Card suit _) -> suit) hand

Nota no entanto, devido à forma como os derivados automaticamente Ordinstâncias trabalhar o seu Cardtipo já seria ordenado por naipe primeiro e depois posto se você acabou de adicionar um deriving Ordà sua definição de dados.

Respondeu 24/10/2019 em 15:13
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more