Cum vă sorta o listă de tuplu de către unul dintre tuplul-Haskell

voturi
-1

Am o listă de cărți și doresc să lista de carduri ([Card]), prin costum, dar modul în care cardul este definit face confuz pentru a naviga sortați. Poate cineva să mă ajute să definească o funcție simplă pentru a sorta lista.

A încercat lucruri cum ar fi sortHand :: [Card] -> [Card] sortHand mână = un fel de mână, dar cant dau seama cum de a filtra doar costumul

Cardul este definit: Suit date = Spade | Club | Diamond | derivand Heart (Eq, Ord, Enum, mărginite)

Locul date = Două | Trei | Patru | cinci | Șase | Șapte | opt | Nouă | Zece | Jack | Regina | Regele | Ace derivand (Eq, Ord, Enum, mărginite)

Card de date = Locul Card Suit derivarea (Eq)

Întrebat 24/10/2019 la 11:56
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
1

Acest lucru este ușor dacă faci Cardun tip de înregistrare :

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}]
Publicat 24/10/2019 la 14:41
sursa de către utilizator

voturi
3

Aceasta este ceea ce sortBy :: (a -> a -> Ordering) -> [a] -> [a]și comparing :: Ord b => (a -> b) -> (b -> b -> Ordering)funcțiile sunt pentru. Primul vă permite să sortează după o ordonare personalizată, celălalt vă permite să definiți o ordonare prin cartografiere ae la unele bcare are o ordonare (o carte pentru un costum în acest exemplu).

Ai putea folosi aceste împreună pentru a defini

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

Notă Cu toate acestea , datorită modului în care derivă în mod automat Ordinstanțele munca dumneavoastră de Cardtip ar fi deja comandat de costum și apoi rang dacă tocmai ați adăugat o deriving Ordîn definiția de date.

Publicat 24/10/2019 la 15:13
sursa de către utilizator

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