首页 > 解决方案 > 你如何通过一个元组-Haskell 对元组列表进行排序

问题描述

我有一张卡片列表,并想按花色对卡片列表([Card])进行排序,但卡片的定义方式使导航变得混乱。有人可以帮我定义一个简单的函数来对列表进行排序。

尝试过类似的事情:

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)

标签: haskell

解决方案


这就是sortBy :: (a -> a -> Ordering) -> [a] -> [a]andcomparing :: Ord b => (a -> b) -> (b -> b -> Ordering)函数的用途。第一个允许您按自定义排序进行排序,另一个允许您通过将a's 映射到b具有排序的某些排序(在本例中为卡片到套装)来定义排序。

您可以一起使用这些来定义

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

但是请注意,由于自动派生Ord实例的工作方式,您的Card类型将首先按套装排序,然后如果您刚刚将 a 添加deriving Ord到数据定义中,则对其进行排名。


推荐阅读