2013-04-24 7 views
6

Potresti dirmi se esistono estensioni del meccanismo di derivazione Haskell per la classe Enum? Voglio dire ci sono un sacco di situazioni ragionevoli oltre al caso "costruttori nullari". Ci sono lavori su questo argomento?Enumerazione di GADT in Haskell

risposta

4

Hai davvero bisogno di GADT? O vuoi semplicemente sollevare la restrizione ad un semplice tipo di enumerazione con solo costruttori nullari? Se quest'ultimo, allora ci sono opzioni. Uno consiste nell'utilizzare il meccanismo Generic di GHC insieme all'implementazione di una classe di enumerazione adeguatamente generica. Questo è disponibile nel pacchetto generic-deriving. Ecco un esempio:

{-# 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 

Ora, test è la seguente lista:

[ 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) 
] 

Questa implementazione di genum utilizza diagonalizzazione di unire prodotti. Ciò garantisce che ogni valore appaia effettivamente da qualche parte nell'elenco, ma può portare a un ordine sorprendente a sua volta.

+0

Oh, questo è quello a cui stavo pensando. Grazie. –