Здравствуйте, Rtveliashvili Denys, Вы писали:
RD>Доброе время суток!
RD>Есть произвольный экземпляр некого ADT (скажем, Left 5) и хочется превратить его в конструкцию вида (C, [V]), где C это некоторое представление конструктора, а [V] — спискок аргументов. Причем так, чтобы потом можно было собрать все обратно. И очень желательно иметь возможность превращать C и V в String и назад.
RD>Поски в области generic programming in Haskell пока что наводят на мысль, что C это скорее всего Constr, а V это быть может Dynamic. Но как распилить а потом запилить обратно (потенциально, после некоторых подкручиваний) — не ясно.
gmapQ :: (forall d. Data d => d -> u) -> a -> [u] Source<br />
A generic query that processes the immediate subterms and returns a list of results. The list is given in the same order as originally specified in the declaratoin of the data constructors.
RD>Есть ли у уважаемых специалистов идеи на этот счет?
Scrap Your Bolierplate — верное направление.
А самой задачей не поделишься? Может, попроще решение есть.
T>gmapQ :: (forall d. Data d => d -> u) -> a -> [u] Source<br />
<span class='lineQuote level1'>T>A generic query that processes the immediate subterms and returns a list of results. The list is given in the same order as originally specified in the declaratoin of the data constructors.</span>
Спасибо, thesz.
Удалось "распилить" произвольное v при помощи (toConstr v, gmapQ toDyn v). "Запиливать" в общем случае видимо надо при помощи fromConstrM. По крайней мере так хоть есть идеи насчет того, как подкинуть конструктору более одного аргумента.
T>А самой задачей не поделишься? Может, попроще решение есть.
Хочется в общем-то немного:
1. Свой вариант сериализации для стандартных для Haskell структур данных.
2. Возможность иметь упрощенный view для произвольного дерева из ADT. Что позволяет, например, в UI соорудить по нему какой-нибудь древовидный список.
3. Возможность вытащить из дерева нужный элемент, заданный списком индексов, или заменить его на другой.
4. Zipperы для чего угодно без boilerplate code (эта штука, думаю, уже давно существует).
В общем, ничего фундаментально нового. Но просто пока я не въеду в то, как это сделать самому, толку от сторонних библиотек не сильно много. Все равно с моей везучестью они "из коробки" не работают и приходится что-нибудь да подкручивать.
RD>Хочется в общем-то немного:
RD>1. Свой вариант сериализации для стандартных для Haskell структур данных.
Могу посоветовать Template Haskell чтобы выводить классы сериализации.
Но только посоветовать, настаивать не буду.
RD>2. Возможность иметь упрощенный view для произвольного дерева из ADT. Что позволяет, например, в UI соорудить по нему какой-нибудь древовидный список.
RD>3. Возможность вытащить из дерева нужный элемент, заданный списком индексов, или заменить его на другой.
RD>4. Zipperы для чего угодно без boilerplate code (эта штука, думаю, уже давно существует).
http://hackage.haskell.org/packages/archive/zipper/0.3/doc/html/Generics-MultiRec-Zipper.html
Я не так часто пользуюсь зипперами и структуры у меня простые, поэтому пока пишу ручками с дополнительным кодом.