簡體   English   中英

你如何通過一個元組-Haskell 對元組列表進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM