gpt4 book ai didi

haskell - 如何在 Haskell 中实现数据类型的自定义排序?

转载 作者:行者123 更新时间:2023-12-01 22:34:30 24 4
gpt4 key购买 nike

假设我有一个代表一副扑克牌的数据类型

data Suit = Clubs | Spades | Hearts | Diamonds deriving (Eq)

instance Show Suit where
show Diamonds = "♦"
show Hearts = "♥"
show Spades = "♠"
show Clubs = "♣"

data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace deriving (Eq, Ord)

data Card = Card {
value :: Value
, suit :: Suit
} deriving (Eq, Ord)

instance Show Card where show (Card v s) = 显示 s++ 显示 v

Haskell 已经帮了我很多,它允许我在不明确指定这些关系的情况下推导 EqOrd。这特别有用,因为我想使用 Ord 根据扑克规则最终比较两手牌的值(value)。

现在在扑克中,花色在顺序上并不重要。因此我尝试了

instance Ord Suit where
compare Clubs Spades = EQ
compare Clubs Hearts = EQ
compare Clubs Diamonds = EQ
compare Spades Hearts = EQ
compare Spades Diamonds = EQ
compare Hearts Diamonds = EQ

这已经有点冗长了……而且它甚至不起作用:

*P054> a
♠A
*P054> b
♣A
*P054> a < b
*** Exception: P054.hs:(12,9)-(17,36): Non-exhaustive patterns in function compare

那么我如何才能正确定义 Suit 的顺序来表达所有花色都相同的事实?

最佳答案

您缺少几个组合,例如所有的 Clubs 都在右边。如果全部相等,无论输入如何,compare 的可能结果是什么?只有一个:EQ。因此我们甚至不需要查看 ab:

instance Ord Suit where
compare _ _ = EQ

但是,Ord 实例毫无用处。或者,您可以为 Card 创建一个自定义实例,

instance Ord Card where
compare a b = compare (value a) (value b)
-- compare = compare `on` value -- using `on` from Data.Function
-- compare = comparing value -- using `comparing` from Data.Ord

关于haskell - 如何在 Haskell 中实现数据类型的自定义排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26410801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com