Kat*_* J. 7 haskell combinatorics gadt
你能否告诉我有没有为Enum类提供Haskell派生机制的扩展?我的意思是除了"nullary constructors"之外还有很多合理的情况.这个主题有什么作品吗?
您真的需要 GADT 吗?或者您只是想解除对仅具有无效构造函数的普通枚举类型的限制?如果是后者,那么还有选择。Generic一种是将 GHC 的机制与适当的通用枚举类的实现一起使用。这可以在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
Run Code Online (Sandbox Code Playgroud)
现在,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)
]
Run Code Online (Sandbox Code Playgroud)
此实现genum使用对角化来合并乘积。这保证了每个值实际上出现在列表中的某个位置,但可能会依次导致令人惊讶的顺序。