Hoe maak je een lijst van de tupel te sorteren op een van de tupel-Haskell

stemmen
-1

Ik heb een lijst met kaarten en willen naar de lijst van kaarten ([Card]) per kleur, maar de manier waarop Card wordt gedefinieerd maakt het verwarrend om te navigeren sorteren. Kan iemand me helpen een eenvoudige functie om de lijst te sorteren definiëren.

Geprobeerd dingen zoals sortHand :: [Card] -> [Card] sortHand de hand = soort hand, maar kan niet achterhalen hoe het pak alleen filteren

De kaart is gedefinieerd: data Suit = Spade | Club | Diamond | Hart afleiden (Vgl, Ord, Enum, Bounded)

gegevens Rank = Twee | drie | vier | vijf | zes | zeven | acht | negen | tien | Jack | Queen | koning | Ace afleiden (Vgl, Ord, Enum, Bounded)

gegevenskaart = Card Suit positie afleiden (Eq)

De vraag is gesteld op 24/10/2019 om 11:56
bron van user
In andere talen...                            


2 antwoorden

stemmen
1

Dit is gemakkelijk als u Cardeen type record :

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}]
antwoordde op 24/10/2019 om 14:41
bron van user

stemmen
3

Dit is wat de sortBy :: (a -> a -> Ordering) -> [a] -> [a]en comparing :: Ord b => (a -> b) -> (b -> b -> Ordering)functies voor. De eerste kunt u sorteren op een aangepaste bestellen, de andere kunt u een bestelling definiëren door mapping a's om een aantal bdie een ordening (een kaart om een pak in dit voorbeeld) heeft.

Je zou kunnen samen gebruik maken van deze te definiëren

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

Opmerking echter te wijten aan de manier waarop de automatisch afgeleid Ordgevallen werk je Cardhet type zou reeds besteld worden door pak eerst en dan rang als je gewoon een toegevoegd deriving Ordaan uw gegevens definitie.

antwoordde op 24/10/2019 om 15:13
bron van user

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