Haskell: потрошение ADT
От: Rtveliashvili Denys Великобритания  
Дата: 10.08.09 20:37
Оценка:
Доброе время суток!

Есть произвольный экземпляр некого ADT (скажем, Left 5) и хочется превратить его в конструкцию вида (C, [V]), где C это некоторое представление конструктора, а [V] — спискок аргументов. Причем так, чтобы потом можно было собрать все обратно. И очень желательно иметь возможность превращать C и V в String и назад.

Поски в области generic programming in Haskell пока что наводят на мысль, что C это скорее всего Constr, а V это быть может Dynamic. Но как распилить а потом запилить обратно (потенциально, после некоторых подкручиваний) — не ясно.

Есть ли у уважаемых специалистов идеи на этот счет?
Re: Haskell: потрошение ADT
От: thesz Россия http://thesz.livejournal.com
Дата: 11.08.09 10:15
Оценка:
Здравствуйте, 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 =&gt; d -&gt; u) -&gt; a -&gt; [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 — верное направление.

А самой задачей не поделишься? Может, попроще решение есть.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[2]: Haskell: потрошение ADT
От: Rtveliashvili Denys Великобритания  
Дата: 11.08.09 21:25
Оценка:
T>

gmapQ :: (forall d. Data d =&gt; d -&gt; u) -&gt; a -&gt; [u] Source<br />
<span class='lineQuote level1'>T&gt;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 (эта штука, думаю, уже давно существует).

В общем, ничего фундаментально нового. Но просто пока я не въеду в то, как это сделать самому, толку от сторонних библиотек не сильно много. Все равно с моей везучестью они "из коробки" не работают и приходится что-нибудь да подкручивать.
Re[3]: Haskell: потрошение ADT
От: thesz Россия http://thesz.livejournal.com
Дата: 11.08.09 22:26
Оценка:
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

Я не так часто пользуюсь зипперами и структуры у меня простые, поэтому пока пишу ручками с дополнительным кодом.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.