2013-04-24 31 views
6

Czy możesz mi powiedzieć, czy są jakieś rozszerzenia mechanizmu wywodzącego się z Haskell dla klasy Enum? Mam na myśli wiele rozsądnych sytuacji poza przypadkami "konstruktorów nullary". Czy są jakieś prace na ten temat?Wyliczanie GADT w Haskell

Odpowiedz

4

Czy naprawdę potrzebujesz GADT? A może chcesz tylko znieść ograniczenie do zwykłego typu wyliczeniowego z tylko zerowymi konstruktorami? Jeśli to drugie, to są opcje. Jednym z nich jest użycie mechanizmu GHC Generic wraz z implementacją odpowiednio ogólnej klasy wyliczeniowej. Jest dostępny w pakiecie generic-deriving. Oto przykład:

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

Teraz test jest następująca 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) 
] 

Ta implementacja genum wykorzystuje diagonalizację scalić produktów. Gwarantuje to, że każda wartość rzeczywiście pojawia się gdzieś na liście, ale może z kolei prowadzić do zaskakującego porządku.

+0

Och, właśnie o tym myślałem. Dziękuję Ci. –