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
6
A
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.
Och, właśnie o tym myślałem. Dziękuję Ci. –