gpt4 book ai didi

Haskell 循环顺序关系

转载 作者:行者123 更新时间:2023-12-02 17:33:02 25 4
gpt4 key购买 nike

我试图定义石头剪刀布的数据类型,并想出了这样的东西:

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,然后指定该数据类型比较 R P = LT比较 P R = GT 而不必手动编写所有比较,对于三个元素来说还可以,但每个添加的元素都会变得乏味。

最佳答案

您在这里描述的不是顺序关系。顺序关系为:

  1. 自反,所有值x都小于或等于它本身;
  2. 反对称:如果x小于或等于y并且y小于或等于x >,那么x等于y
  3. 传递:如果x小于或等于y,并且y小于或等于到 z,则 x 小于或等于 z

您的定义传递。确实:S 小于 RR 小于 P,但是 S > 不小于P。因此,我强烈建议您不要使用Ord,因为例如排序等都会利用这些不变量。

您可以做的就是让它自动从 Ord 派生:

data Hand = P | S | R deriving (Show, Eq<b>, Ord</b>)

然后定义一个函数beats:

beats :: Hand -> Hand -> Ordering
beats R P = LT
beats P R = GT
beats x y = compare x y

关于Haskell 循环顺序关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154663/

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