我试图为岩石剪刀定义一种数据类型,并想出如下所示:
data Hand = P | S | R deriving (Show, Eq)
instance Ord Hand where
compare R P = LT
compare P R = GT
compare R S = GT
compare S R = LT
compare P S = LT
compare S P = GT
compare _ _ = EQ在编写所有我想知道的内容时,我想知道是否有任何方法来定义数据类型,让它派生Ord,然后指定compare R P = LT和compare P R = GT,而不是手工编写所有的比较,对于三个元素来说,这是可以的,但是每个添加的元素都会变得单调乏味。
发布于 2017-11-12 16:11:48
我最喜欢@freestyle的答案,而且受此影响,只需画一个Cirord类型的类,它可以适用于任何这样的循环有序数据类型,如Pokemons等:)
class (Bounded a, Ord a) => Cirord a where
ccompare :: a -> a -> Ordering
cmax, cmin :: a -> a -> a
ccompare x y = let mima = [minBound, maxBound]
in if x `elem` mima && y `elem` mima then compare y x
else compare x y
cmax x y = if ccompare x y == LT then y else x
cmin x y = if ccompare x y == LT then x else y
data Hand = P | S | R deriving (Show, Eq, Ord, Bounded)
instance Cirord Hand
*Main> ccompare P R
GT
*Main> ccompare S R
LT
*Main> ccompare R S
GT
*Main> ccompare R P
LT
*Main> ccompare P S
LT
*Main> ccompare S P
GThttps://stackoverflow.com/questions/47154663
复制相似问题