gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:28:48 25 4
gpt4 key购买 nike

我遵循 Haskell 维基页面上的建议:Performance/Data types提高我的代码的性能,但是当我改变时

data Color = Yellow | Red | Green | Blue | Empty deriving (Show, Eq)

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

正如文章中所建议的,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'

我很少使用 Enum,如何将 Color 转换为 Enum 类型?我必须实现它定义的所有功能吗?我认为当您派生该类时它们都已实现。

最佳答案

有时 GHC 的建议很糟糕,但在这种情况下它是正确的。在文件顶部,放置

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

GeneralizedNewtypeDeriving 是一种语言扩展,允许您指定某些类应“转发”到其表示的实例。也就是说,newtype Color = Color Int deriving (Enum) 表示仅通过使用 Int 来实现 ColorEnum 实例code> 的(经过一些必要的包装/解包后,GHC 会为您生成)。

但如果这是您需要 Enum 的唯一原因,您也可以省略它并直接执行

(yellow:red:green:blue:empty:_) = map Color [1..]

关于haskell - 在 haskell 中将枚举转换为类似 int 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13761243/

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