Есть ли монады, которые можно использовать как автомат? - PullRequest
7 голосов
/ 07 декабря 2011

Я пишу потоковый преобразователь из некоторого типа входных данных в тип выходных данных. Ввод данных осуществляется пользователем, поэтому между событиями существует некоторое время. Поскольку каждый вход требует некоторой загрузки ресурсов, я бы хотел «заглянуть в будущее», то есть отправить все возможные входные данные в основные вычислительные ресурсы и предварительно загрузить ресурсы на основе результатов.

В настоящее время всегда есть ровно один выход после каждого входа, но в конечном итоге это может быть интересно изменить.

Мне удалось реализовать это с помощью трансформатора Automaton Росса Патерсона. Я не уверен, что мое решение является оптимальным.

  • Есть ли хорошие примеры, как это сделать? Возможно даже с тестовым кодом?
  • Может ли это быть достигнуто и с помощью монады? (Примеры? Объяснение, почему это невозможно?)

Edit: После звонка для уточнения я добавил код здесь. Сейчас я его удаляю (это было непонятно) и добавляю другое объяснение. На мой вопрос ответь.

Мое намерение состояло в том, чтобы остановить цикл основного события после каждого пользовательского ввода, который был подан на стрелку / преобразователь потока / что угодно. Затем он будет хранить текущее состояние автомата и посылать все возможные входы (фальшивые события) один за другим в автомат и видеть, какие ресурсы должны быть загружены для их кэширования. После следующего реального события он будет использовать кэш для лучшего отклика. Это не должно влиять на основные вычисления.

1 Ответ

8 голосов
/ 07 декабря 2011

Все упомянутые вами варианты использования охватываются библиотекой Netwire .Он обеспечивает обобщение стрелы автоматов Росса для семейства wire стрелок.Я еще не закончил вики-страницу , но она должна дать вам достаточно для начала.

Комбинируя это с Kleisli (LogicT m) для некоторой монады m, вы получаете недетерминированные провода.

И в качестве дополнительного примечания: вы хотите не монаду.

...