Штука мощная.
Описал ими дерево значений - листья примитивного типа, вектора и записи:
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... )
Comments 6
Вот лисп недавно ругали за то, что если хочется на нём как-то осмысленно работать со структурами данных, извольте держать в голове все эти CAR, CADR, CADDR - пути до соответствующих элементов.
И что мы видим?
Что берётся хаскелл, и ну его абстрагировать вдребезги пополам.
Может, сразу лисп сделать? :))
Reply
Вот мои слова: Хаскель предлагает достаточно удобный для большинства задач уровень абстракции - алгебраические типы, сравнение с образцом, классы типов. Забираясь выше, легко попасть в ловушку не решения проблемы предметной области, не достижения цели, а решения проблемы отображения решения проблемы предметной области на фиксированный уровень абстракции и ни ангстремом ниже.
Я попробовал, не получилось, теперь спрашиваю вслух - а у кого-либо получалось похожее?
Любой ответ меня удовлетворит.
Пока же я остаюсь при моих ранних словах. То есть, не лезу слишком высоко.
Reply
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
И "смотрит в книгу, видит фигу" тоже.
Не учёл, что cast :: ... -> Maybe b. Блин.
Но уже успел всё переписать на обычные ADT. ;)
Reply
А EQ, кажется, только через классы.
Reply
С EQ чуть выше показали.
Блин.
Пора домой идти.
Reply
Leave a comment