【发布时间】:2019-10-05 15:14:55
【问题描述】:
我是 Haskell 的新手。
我想使用 Enum 类为自定义数据类型实现 Ord 类。
如果我实现 Enum 类并在 Ord 所需的 compare 函数的实现中直接使用 fromEnum 函数,它工作正常 类。
但由于 类型签名 和 类型级别约束 适用于 可读性 和 文档。我想在 Enum 实例上指定我的自定义数据 depends 的 Ord 实例。 当我编写以下代码时,它会引发错误。
data DayOfWeek
= Mon | Tue | Weds | Thu | Fri | Sat | Sun
deriving (Eq, Show)
instance Enum DayOfWeek => Ord DayOfWeek where
compare a b = compare (fromEnum a) (fromEnum b)
instance Enum DayOfWeek where
toEnum 1 = Mon
toEnum 2 = Tue
toEnum 3 = Weds
toEnum 4 = Thu
toEnum 5 = Fri
toEnum 6 = Sat
toEnum 7 = Sun
fromEnum Mon = 1
fromEnum Tue = 2
fromEnum Weds = 3
fromEnum Thu = 4
fromEnum Fri = 5
fromEnum Sat = 6
fromEnum Sun = 7
错误:
* Non type-variable argument in the constraint: Enum DayOfWeek
(Use FlexibleContexts to permit this)
* In the context: Enum DayOfWeek
While checking an instance declaration
In the instance declaration for `Ord DayOfWeek'
我们可以在具体类型上写约束吗
【问题讨论】:
-
先定义
Enum实例,然后定义Ord实例会更简单。此外,需要Enum实例和简单地使用 定义Ord实例之间存在区别。