gpt4 book ai didi

haskell - 声明一个具有完整定义的子类

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

我正在尝试执行以下操作:

-- enum which wraps arround
class (Enum a, Bounded a) => CyclicEnum a where
next, prev :: a -> a

-- for equatable types this is readily implemented
instance (Enum a, Bounded a, Eq a) => CyclicEnum a where
next x | x == maxBound = minBound
| otherwise = succ x

prev x | x == minBound = maxBound
| otherwise = pred x

但是除非我同时启用FlexibleInstances和UndecidableInstances,否则这不会编译,这似乎不对。做这样的事情的正确方法是什么(即通常使用的方法,最好没有语言扩展)?有吗?

最佳答案

首先,FlexibleInstances 没有任何问题——它只是禁用了标准 Haskell 的一些限制,这些限制主要是出于历史原因,也许是为了使编译器更容易编写。但如果您只使用 GHC(几乎每个人都这样做),那么就没有真正的理由不使用 FlexibleInstances

UndecidableInstances 更具争议性,但在某些情况下也绝对可以使用它。

但是,在您的示例中,我认为根本不需要定义任何新类型类!为什么不直接定义为自由函数,

next, prev :: (Enum a, Bounded a, Eq a) => a -> a
next x | x == maxBound = minBound
| otherwise = succ x
prev x | x == minBound = maxBound
| otherwise = pred x

嗯。除了通用实例之外,您的意图可能是还为 CyclicEnum 添加其他实例。但这实际上是不可能的!即使使用UndecidableInstances。它需要 OverlappingInstances(或者更确切地说,Overlappable 编译指示),但重叠实例确实不是您应该仅仅因为可以使用而使用的东西。

关于haskell - 声明一个具有完整定义的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34338818/

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