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
6
A
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.
Oh, questo è quello a cui stavo pensando. Grazie. –