Инструменты для просмотра стрелок Haskell в виде графиков

Стрелки Haskell обычно объясняются как выражение ориентированного ациклического графа (DAG) вычислений. Я ищу инструменты или библиотечный код, который использовал бы эту связь для помощи в программировании с помощью Arrows.

От стрелки к графику инструмент может помочь визуализировать код стрелки. Поскольку код соответствует DAG вычислений, визуальное представление, показывающее вычислительные узлы и ребра выхода-входа, является естественным. Инструмент может создать график для просмотра и управления с помощью стандартных графических инструментов.

Существует ли преобразователь Arrow, который дополняет произвольный вычислительный класс Arrow, захватывая структуру, обеспечиваемую операциями >>> и ***, и позволяя просматривать вычисления в виде графа элементарных операций Arrow?

Предположим, что от графа к стрелке существует группа DAG, узлы которой являются операциями со стрелкой. Есть ли инструмент, который построил бы из этого Arrow, который вычисляет всю DAG?

Я прогуглил многое из того, что написано о Haskell Arrows, но не нашел таких инструментов визуализации. Я что-то пропустил? Возможно, это не так естественно, как я ожидаю.


person pkturner    schedule 23.02.2014    source источник
comment
Все еще надеюсь на ответ, который поможет с графиком для инструмента Arrow. Я начинаю понимать, что когда элементарные стрелки имеют типы кортежей, тогда граф должен быть более выразительным, чем простой DAG, чтобы определить, какой выход идет к какому входу. Есть ли название или теория для таких графов?   -  person pkturner    schedule 24.02.2014
comment
Я не могу точно сказать, что вы спрашиваете в отношении графа к Arrow, но если у вас есть тип, представляющий DAG, узлы которого являются операциями Arrow, похоже, вы можете просто дать этому типу экземпляр Arrow и все готово.   -  person Tom Ellis    schedule 24.02.2014
comment
@Tom: Было бы так просто, если бы DAG не делали ничего необычного с типами кортежей. Я имел в виду, например, !граф из 4 узлов с перекрещивающимися 4 стрелками. Похоже, что когда я заполню детали более выразительного типа графика, который мне нужен, ваше предложение по-прежнему работает.   -  person pkturner    schedule 25.02.2014


Ответы (1)


Хорошей отправной точкой является определение вашего стрелочного графика с помощью так называемого «Свободного Arrow». Вы можете найти одну реализацию бесплатных Arrows в этом ответе на переполнение стека. Думайте об этом как о синтаксическом представлении вашего графа Arrow.

Преимущество бесплатных Arrow в том, что они сохраняют структуру графика, который затем можно отобразить в виде диаграммы. После отображения графика соединений вы можете использовать интерпретатор для преобразования свободного Arrow в желаемое Arrow. Одно приятное свойство свободных Arrow заключается в том, что такой интерпретатор должен быть уникальным (с точностью до изоморфизма) по определению (это одно из свойств, которое делает его «бесплатным»).

person Gabriel Gonzalez    schedule 23.02.2014
comment
Это хороший ответ на стрелку для графической части моего вопроса. Выглядит лучше, чем моя идея трансформера Стрелы. - person pkturner; 24.02.2014
comment
@pkturner Я думаю, что вам может понадобиться расширение языка Arrows, которое позволяет вам создавать Arrow из множества ребер. По сути, каждый раз, когда вы пишете y <- someArrow -< x, создается ребро между узлами x и y, где ребро someArrow. Если это близко к тому, что вы имели в виду, я добавлю это к своему ответу. - person Gabriel Gonzalez; 24.02.2014
comment
Это то, что я искал. Мой пример !4 узла с перекрещивающимися 4 стрелками можно записать (a1,a0) ‹- (источник -‹ ()) (b1,b0) ‹- (источник -‹ ()) () ‹- сток -‹ (a0,b0) () ‹- сток -‹ (a1,b1) Кстати, откуда я мы вызываем элементарные узлы операций Arrow и соединение между выходными и входными ребрами. - person pkturner; 25.02.2014