您能告诉我Enum类的Haskell派生机制是否有扩展?我的意思是除了``空构造函数''的情况以外,还有很多合理的情况。关于这个话题有什么作品吗?
最佳答案
您真的需要GADT吗?还是只想将限制限制为仅使用null构造函数的普通枚举类型?如果是后者,那么就有选择。一种是将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
的此实现使用对角线化来合并产品。这保证了每个值实际上都出现在列表中的某处,但可能依次导致令人惊讶的顺序。关于haskell - Haskell中的GADT枚举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16198280/