2013-04-24 7 views
6

EnumクラスのHaskell導出メカニズムの拡張はありますか教えてください。私は、 `` nullary constructors ''のケースのほかに、多くの合理的な状況があることを意味します。このトピックに関連する作品はありますか?HaskellでのGADTの列挙

答えて

4

本当にGADTが必要ですか?あるいは、無限のコンストラクタだけを持つ単純な列挙型に制限を持ち上げたいだけですか?後者の場合は、オプションがあります。 1つは、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

ああ、それは私が考えていたものです。ありがとうございました。 –

関連する問題