Haskell: FRP реактивный парсек? - PullRequest
10 голосов
/ 13 июля 2011

Есть ли (или возможно ли иметь) реактивный Parsec (или любой другой чисто функциональный парсер) в Haskell?

Проще говоря, я хочу кормить парсер сам char за символ и получать столько, сколько я кормлю достаточно, чтобы получить вывод.

Или намного проще, как я могу сделать это в foldr или хотя бы map?

Нужна ли нам другая их версия для поддержки такого реактивного поведения?

EDIT

Мой вопрос касается, в частности, FRP. В качестве примера я использовал парсер, который был лучшим, что я мог придумать, чтобы прояснить свой вопрос и дать общую картину того, что мне нужно.

Я считаю, что FRP - это не только пользовательский интерфейс, верно?

Ответы [ 4 ]

8 голосов
/ 14 июля 2011

Я не думаю, что это правильно называть это "FRP", правильное название для такого рода вещей - онлайн-алгоритм , что означает, что парсер выдает выходные данные, как толькокак он получает вход.(В отличие от автономного алгоритма , где анализатор получает весь ввод заранее и выводит из него результат.)

В Haskell ленивая оценка упрощает написание онлайн-алгоритмов.Malcom Wallace разработал специальный набор синтаксических анализаторов для анализа в режиме онлайн, которые используют ленивый анализ.

8 голосов
/ 13 июля 2011

Вы не можете выполнять онлайн-анализ в Parsec, он должен использовать все входные данные, чтобы определить, есть ли действительный анализ или нет.

Однако есть альтернативы. Одной из возможностей является использование Utrecht парсера-комбинатора , он имеет онлайн-анализ среди своих функций.

6 голосов
/ 15 июля 2011

Вы можете выполнять онлайн-анализ в Parsec, но для этого вам нужно наложить его поверх чего-то вроде итератора.

Parsec 3 способен работать с произвольными типами Stream, поэтому вы можете сделатьэкземпляр Stream, который просматривает текущий «поток» как позицию и использует итератор для получения значения в этой позиции.

Одним из таких примеров является пакет iteratee-parsec .

Другой подход обеспечивается синтаксическим анализом trifecta talk на итераторах и parsec (предупреждение PDF):

Компромисс заключается в создании типа, подобного iteratee, который буферизует последние несколько фрагментов фрагментаа не все из них, чтобы позволить ему сохранить ограниченное использование пространства, и полагаться на механизм повторяющихся для возврата за пределы этого.Это то, чем я сейчас пользуюсь, но у меня нет для него кода в сети.

После того, как вы перевернули управление, запустив Parsec поверх Iteratee, довольно легко передать ему ввод символа ввремя и посмотрим, удалось ли ему еще что-нибудь распознать.

1 голос
/ 07 сентября 2012

Посмотрите на attoparsec-канал, при правильном парсере это может быть полезным способом преобразования потока байтов в поток проанализированных структур данных

...