Haskell Enumerations从1开始

时间:2011-10-19 04:57:33

标签: haskell

考虑以下方法在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)

如果没有,是否有更简单的方法来做到这一点?

2 个答案:

答案 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