Впечатления от GADT.

Nov 18, 2008 17:13

Штука мощная.

Описал ими дерево значений - листья примитивного типа, вектора и записи:
data ValueTree :: * -> * where
VTPrim :: (Prim ty) -> ValueTree (Prim ty)
VTVec :: ValueTree a -> ValueTree [ValueTree a]
VTRec :: Map String RecordField -> ValueTree (Map String RecordField)

data RecordField = forall a . RecordField (ValueTree a) ( Read more... )

gadt, работа, Хаскель

Leave a comment

Comments 6

kodt_rsdn November 18 2008, 14:40:49 UTC
В порядке подкузьмления.
Вот лисп недавно ругали за то, что если хочется на нём как-то осмысленно работать со структурами данных, извольте держать в голове все эти CAR, CADR, CADDR - пути до соответствующих элементов.

И что мы видим?
Что берётся хаскелл, и ну его абстрагировать вдребезги пополам.
Может, сразу лисп сделать? :))

Reply


mibori November 18 2008, 15:15:02 UTC
а с Typeable точно не получается? Вроде же был такой пример от lomeo:

data B = forall a . (Show a, Typeable a) => Bc a

instance Show B where
show (Bc a) | Just (x :: Int) <- cast a = "Int " ++ show x
show (Bc a) | Just (x :: String) <- cast a = "String " ++ show x
show (Bc a) = "Other " ++ show aВроде рабочий.

Reply

thesz November 18 2008, 15:26:49 UTC
"Дурная голова ногам покоя не даёт" - это точно про меня. ;)

И "смотрит в книгу, видит фигу" тоже.

Не учёл, что cast :: ... -> Maybe b. Блин.

Но уже успел всё переписать на обычные ADT. ;)

Reply


zelych November 18 2008, 15:19:25 UTC
Не совсем понял, что (.>) будет делать с ValueTree Prim.
А EQ, кажется, только через классы.

Reply

thesz November 18 2008, 15:27:46 UTC
(.>) на Prim должен ругаться error.

С EQ чуть выше показали.

Блин.

Пора домой идти.

Reply


Leave a comment

Up