gpt4 book ai didi

haskell - (重新)-定义(==)类 Eq

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

在以下示例中:

data ColourName 
= White
| Grey
| Gray
| Black
| Blue
-- ...
-- hundreds more of colours
-- ...
| LastColor
deriving (Read, Show, Eq)

我想重新定义 (==)这样 GreyGray评价为相等。

显然,一种方法是不包括 Eqderiving ,但是,那么我必须定义
(==) :: ColourName
(==) White White = True
(==) Gray Gray = True
(==) Grey Grey = True
(==) Gray Grey = True
(==) Grey Gray = True
(==) Black Black = True
-- frickin' log of other colors, hundreds of lines of typing
(==) LastColor LastColor = True
(==) a b = False

这不是我打算做的。

我也做不到
instance Eq ColourName where
(==) :: ColourName -> ColourName -> Bool
(==) Gray Grey = True
(==) Grey Gray = True
(==) a b = (a == b)

因为这会导致无限递归,所以基本上是未定义的。

有出路吗?

(不,我不想使用 data Colour = Colour String 或类似的。我希望将有效颜色表示为枚举,例如提供自动验证,但希望允许模块的最终用户进行拼写变化!)

最佳答案

您可以使用派生的Enum实例 :

data ColourName = Gray | Grey | ...
deriving (Read, Show, Enum)

instance Eq ColourName where
Gray == Grey = True
Grey == Gray = True
a == b = fromEnum a == fromEnum b

编辑:您也可以使用 PatternSynonyms与 GHC 7.8+。它像智能构造函数一样工作,但也可用于模式匹配。
pattern Gray = Grey

关于haskell - (重新)-定义(==)类 Eq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24433241/

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