首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell循环序关系

Haskell循环序关系
EN

Stack Overflow用户
提问于 2017-11-07 09:49:47
回答 1查看 296关注 0票数 3

我试图为岩石剪刀定义一种数据类型,并想出如下所示:

代码语言:javascript
复制
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 = LTcompare P R = GT,而不是手工编写所有的比较,对于三个元素来说,这是可以的,但是每个添加的元素都会变得单调乏味。

EN

回答 1

Stack Overflow用户

发布于 2017-11-12 16:11:48

我最喜欢@freestyle的答案,而且受此影响,只需画一个Cirord类型的类,它可以适用于任何这样的循环有序数据类型,如Pokemons等:)

代码语言:javascript
复制
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
GT
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47154663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档