Comment trier vous une liste de tuple par l'un des tuple-Haskell

voix
-1

J'ai une liste de cartes et que vous souhaitez trier la liste des cartes ([carte]) par costume, mais la carte est définie ainsi fait source de confusion pour naviguer. Quelqu'un peut-il me aider à définir une fonction simple pour trier la liste.

J'ai essayé des choses comme sortHand :: [Carte] -> [Carte] sortHand main = main de tri, mais ne peux pas comprendre comment filtrer le costume seulement

Card est défini: données Suit = Spade | club | diamant | Coeur de dérivation (Eq, Ord, Enum, Bounded)

données Rank = Deux | trois | quatre | cinq | six | sept | huit | neuf | dix | Jack | Reine | roi | Ace dérivation (Eq, Ord, Enum, bornées)

Card data = Rang Suit la carte provenant (Eq)

Créé 24/10/2019 à 11:56
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

C'est facile si vous faites Cardun type d'enregistrement :

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}]
Créé 24/10/2019 à 14:41
source utilisateur

voix
3

C'est ce que sortBy :: (a -> a -> Ordering) -> [a] -> [a]et les comparing :: Ord b => (a -> b) -> (b -> b -> Ordering)fonctions sont pour. Le premier vous permet de trier par une commande personnalisée, l'autre vous permet de définir un ordre par cartographie a« s à une bqui a une commande (une carte à un costume dans cet exemple).

Vous pouvez utiliser ces ensemble pour définir

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

Notez cependant en raison de la façon dont les dérivées automatiquement des Ordinstances de travail de votre Cardgenre serait déjà être commandé par costume d' abord, puis le rang si vous venez d' ajouter un deriving Ordà votre définition de données.

Créé 24/10/2019 à 15:13
source utilisateur

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