haskell - 你如何通过一个元组-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)
解决方案
这就是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
到数据定义中,则对其进行排名。
推荐阅读
- pandas - 向 matplotlib matshow plot 添加一个值
- ios - 如何从 xcode 获取 TestFlight 应用程序的日志
- java - Java 和 Mac OS java -jar
- date - 在pyspark中将字符串转换为日期(格式年季度)
- html - 复选框重叠复选框标签
- javascript - 使用 document.createElement 创建时更改 html 元素在父标签中的位置
- css - 为什么 CSS 颜色在 PowerShell ConvertTo-HTML 电子邮件中消失?
- spring - 允许 bean 实现不定义 getBean 提供的参数
- python - 用 Python 脚本做 ssh 隧道。错误:“尝试打开 ssh 隧道时无法解析主机名”
- ggplot2 - 如何在ggplot r中的组合条形图和线图中标记线图?