考虑以下方法在Haskell中创建一个1开头的枚举:
data Level = Lower | Middle | Upper
deriving (Show, Eq, Ord)
instance Enum Level where
toEnum 1 = Lower
toEnum 2 = Middle
toEnum 3 = Upper
fromEnum Lower = 1
fromEnum Middle = 2
fromEnum Upper = 3
instance Bounded Level where
minBound = Lower
maxBound = Upper
我宁愿不做以下事情:
data Level = DontUseThis | Lower | Middle | Upper
deriving (Show, Eq, Ord)
如果没有,是否有更简单的方法来做到这一点?
答案 0 :(得分:2)
首先,您不需要自己定义Bounded
实例。如果将Bounded
添加到派生类型类列表中,则应该获得相同的行为。
其次,我能想到的最直接的方法是简单地导出Enum
然后定义自己的翻译函数。所以像这样:
data Level = Lower | Middle | Upper
deriving (Show, Eq, Ord, Bounded, Enum)
toEnum' x = toEnum (x - 1)
fromEnum' x = (fromEnum x) + 1
答案 1 :(得分:0)
您可以使用以下内容更简洁地编写它(好吧,如果您有超过3个构造函数):
import Data.List (elemIndex)
import Data.Maybet (fromJust)
values = [Lower, Middle, Upper]
instance Enum Level where
toEnum n = values !! (n-1)
fromEnum k = 1 + fromJust $ elemIndex k values