2013-04-24 22 views

cevap

4

Gerçekten GADT'ye ihtiyacınız var mı? Ya da sadece kısıtlamaları sadece nulet yapıcılarla düz bir numaralandırma türüne kaldırmak mı istiyorsunuz? İkincisi ise, o zaman seçenekler var. Biri, GHC'nin Generic mekanizmasını uygun bir jenerik numaralandırma sınıfının uygulanması ile birlikte kullanmaktır. Bu, generic-deriving paketinde bulunur.

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

Şimdi test şu listesi::

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

genum Bu uygulama ürününü birleştirmek köşegenleştirmeyi kullanır İşte bir örnek. Bu, her değerin gerçekten listede bir yerde göründüğünü garanti eder, ancak sırayla şaşırtıcı bir siparişe yol açabilir.

+0

Oh, düşündüğüm buydu. Teşekkür ederim. –