在haskell中将枚举转换为类似int的类型

Dre*_*rew 4 enums haskell

我正在关注Haskell的Wiki页面上的建议:性能/数据类型以提高我的代码的性能,但是当我改变时

data Color = Yellow | Red | Green | Blue | Empty deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

newtype Color = Color Int deriving (Eq,Ord,Enum) 
(yellow:red:green:blue:empty:_) = [Color 1 ..]
Run Code Online (Sandbox Code Playgroud)

正如文章中所建议的那样,GHC说:

Can't make a derived instance of `Enum Color':
  `Color' must be an enumeration type
  (an enumeration consists of one or more nullary, non-GADT constructors)
  Try -XGeneralizedNewtypeDeriving for GHC's newtype-deriving extension
In the newtype declaration for `Color'
Run Code Online (Sandbox Code Playgroud)

我没有多次使用Enums,如何将Color变成Enum类型?我是否必须实现它定义的所有功能?我认为当你派生那个课时它们都被实现了.

luq*_*qui 10

有时GHC的建议很糟糕,但在这种情况下,它的确有点出现.在文件的顶部,放

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
Run Code Online (Sandbox Code Playgroud)

GeneralizedNewtypeDeriving是一种语言扩展,允许您指定某些类应"转发"到其表示的实例.也就是说,newtype Color = Color Int deriving (Enum)说要实现ColorEnum只是通过实例Int的(经过一些必要的包装/展开,这GHC为您生成).

但如果这是你需要的唯一原因Enum,你也可以省略它而只是这样做

(yellow:red:green:blue:empty:_) = map Color [1..]
Run Code Online (Sandbox Code Playgroud)