2013-04-24 16 views
6

Könnten Sie mir bitte sagen, gibt es irgendwelche Erweiterungen des Haskell-Ableitungsmechanismus für die Enum-Klasse? Ich meine, es gibt viele vernünftige Situationen neben dem `` nullary constructors '' Fall. Gibt es Arbeiten zu diesem Thema?Aufzählung von GADTs in Haskell

Antwort

4

Brauchen Sie wirklich GADTs? Oder möchten Sie die Beschränkung lediglich auf einen einfachen Aufzählungstyp mit nur reinen Konstruktoren aufheben? Wenn Letzteres, dann gibt es Optionen. Eine besteht darin, den Generic-Mechanismus von GHC zusammen mit einer Implementierung einer geeignet generischen Aufzählungsklasse zu verwenden. Dies ist im Paket generic-deriving verfügbar. Hier ein Beispiel:

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

Nun test ist die folgende Liste:

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

Diese Implementierung von genum verwendet diagonalization Produkte zu verschmelzen. Dies garantiert, dass jeder Wert tatsächlich irgendwo in der Liste erscheint, aber zu einer überraschenden Reihenfolge führen kann.

+0

Oh, daran habe ich gedacht. Vielen Dank. –