为了在外部(例如在数据库中)保存用户帐户权限,我想要表示一个枚举元素的列表,其中包含派生的Enum
实例作为Int
。
数字的每一位都被看作是表示第i个元素是否出现在列表中的标志(或布尔值)。
换句话说 - 每个2的幂代表一个元素和这些权力的总和独特的元素列表。将Enums按列表形式列为Int
例子:
data Permissions = IsAllowedToLogin -- 1
| IsModerator -- 2
| IsAdmin -- 4
deriving (Bounded, Enum, Eq, Show)
enumsToInt [IsAllowedToLogin, IsAdmin] == 1 + 4 == 5
intToEnums 3 == intToEnums (1 + 2) == [IsAllowedToLogin, IsModerator]
功能转换这样的列表为Int
是很容易写:
enumsToInt :: (Enum a, Eq a) => [a] -> Int
enumsToInt = foldr (\p acc -> acc + 2^fromEnum p) 0 . nub
注意,接受的答案包含一个更有效的实现。
真正困扰我的是倒车功能。我可以想象它应该有这种类型:
intToEnums :: (Bounded a, Enum a) => Int -> [a]
intToEnums = undefined -- What I'm asking about
我应该如何处理这个问题?
对于初学者运行它,你看着[了'Data.Bits'模块(HTTP://hackage.haskell 。组织/包/归档/基/最新/ DOC/HTML /数据Bits.html)? – 2013-04-09 19:09:34
@C。 A. McCann不,我没有!你认为这会有用吗? – Jakub 2013-04-09 19:13:32
我不认为它有任何你想要的东西(虽然它看起来应该是那里的东西),但它有一堆按位操作,这会让事情变得更容易。 – 2013-04-09 19:15:25