约束中的非类型变量参数:Enum A => Ord A

Paw*_*mar 0 haskell typeclass

我是Haskell的新手。

我想使用Enum类为自定义数据类型实现Ord类。

如果我实现Enum类并在Ord类所需的compare函数的实现中直接使用fromEnum函数,则效果很好。

但是由于类型签名和类型级别约束是为了提高可读性和文档性。我想指定奥德我的自定义数据的情况下取决于对枚举实例。当我编写以下代码时,它将引发错误。

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
Run Code Online (Sandbox Code Playgroud)

错误:

* 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'
Run Code Online (Sandbox Code Playgroud)

我们可以写具体类型的约束吗