8

您能否告诉我 Enum 类的 Haskell 派生机制是否有任何扩展?我的意思是除了“空构造函数”之外还有很多合理的情况。有没有关于这个主题的作品?

4

1 回答 1

5

你真的需要 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使用对角化来合并产品。这保证了每个值实际上都出现在列表中的某个位置,但反过来可能会导致令人惊讶的顺序。

于 2013-04-25T08:30:42.167 回答