2013-04-24 26 views
6

请问您是否有任何对Enum类的Haskell派生机制的扩展?我的意思是,除了“空洞构造函数”的情况外,还有很多合理的情况。这个主题有什么作品吗?在Haskell中枚举GADT

回答

4

你真的需要GADT吗?或者你是否仅仅想将限制解除为只有无限制构造函数的普通枚举类型?如果后者,那么有选择。一种是将GHC的Generic机制与适当泛型枚举类的实现一起使用。这在generic-deriving包中可用。这里有一个例子:

{-# LANGUAGE DeriveGeneriC#-} 
import Generics.Deriving 

data Tree a = Leaf a | Node (Tree a) (Tree a) 
    deriving (Show, Generic) 

instance GEnum Bool 
instance GEnum a => GEnum (Tree a) 

test :: [Tree Bool] 
test = take 10 genum 

现在,test是以下列表:

[ Leaf False 
, Node (Leaf False) (Leaf False) 
, Leaf True 
, Node (Leaf False) (Node (Leaf False) (Leaf False)) 
, Node (Node (Leaf False) (Leaf False)) (Leaf False) 
, Node (Leaf False) (Leaf True) 
, Node (Node (Leaf False) (Leaf False)) (Node (Leaf False) (Leaf False)) 
, Node (Leaf True) (Leaf False),Node (Leaf False) (Node (Leaf False) (Node (Leaf False) (Leaf False))) 
, Node (Node (Leaf False) (Leaf False)) (Leaf True) 
] 

genum此实现使用对角化合并产品。这保证了每个值实际上出现在列表中的某个位置,但可能会导致令人惊讶的顺序。

+0

哦,那正是我想到的。谢谢。 – 2013-04-25 14:08:42