我正在关注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)
说要实现Color
的Enum
只是通过实例Int
的(经过一些必要的包装/展开,这GHC为您生成).
但如果这是你需要的唯一原因Enum
,你也可以省略它而只是这样做
(yellow:red:green:blue:empty:_) = map Color [1..]
Run Code Online (Sandbox Code Playgroud)