[英]How do you sort a list of tuple by one of the tuple-Haskell
我有一張卡片列表,並想按花色對卡片列表([Card])進行排序,但卡片的定義方式使導航變得混亂。 有人可以幫我定義一個簡單的 function 來對列表進行排序。
嘗試過類似的事情:
sortHand ::[Card]-> [Card]
sortHand hand = sort hand
但我不知道如何只過濾西裝
卡定義:
data Suit = Spade | Club | Diamond | Heart
deriving (Eq, Ord, Enum, Bounded)
data Rank = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten
| Jack | Queen | King | Ace
deriving (Eq, Ord, Enum, Bounded)
data Card = Card Suit Rank
deriving (Eq)
這就是sortBy:: (a -> a -> Ordering) -> [a] -> [a]
和comparing:: Ord b => (a -> b) -> (b -> b -> Ordering)
函數用於。 第一個允許您按自定義排序進行排序,另一個允許您通過將a
映射到具有排序的某些b
來定義排序(在此示例中為卡片到套裝)。
您可以一起使用這些來定義
sortBySuit hand = sortBy (comparing $ \(Card suit _) -> suit) hand
但是請注意,由於自動派生的Ord
實例是如何工作的,如果您剛剛將deriving Ord
添加到數據定義中,您的Card
類型將首先按花色排序,然后再進行排名。
如果您將Card
設置為記錄類型,這很容易:
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}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.