Полный пример для netwire? - программирование
Подтвердить что ты не робот

Полный пример для netwire?

Я прочитал "быстрый запуск" но у меня возникли проблемы с представлением о том, как все будет выглядеть в "реальном" приложении. Поскольку учебник касается только чистых проводов, меня особенно интересуют игры, если они есть, но я бы не прочь других. Реактивные примеры бананов, вероятно, тоже будут. Они должны просто проиллюстрировать, как FRP полезен.

4b9b3361

Ответ 1

Для тех из вас, кто наткнется на это в будущем, я подумал, что это отличный пример полного приложения, использующего netwire. Он также начинает (с сегодняшнего дня) работать над PACMAN.

http://www.reddit.com/r/haskell/comments/1kmes7/building_an_asteroids_clone_in_haskell_using/

http://ocharles.org.uk/blog/posts/2013-08-18-asteroids-in-netwire.html

https://github.com/ocharles/netwire-classics/

Ответ 2

Netwire используется в некоторых реальных приложениях, но я не знаю, где их найти. Скорее всего, сейчас они закрыты. Тем не менее, некоторые примеры приложений были опубликованы в блоге о Reddit, поэтому вы можете проверить /r/haskell. Просто найдите "netwire". К сожалению, реакционно-банановые примеры не помогут, потому что концепции этих двух библиотек, особенно для обработки событий, совершенно разные.

Общая структура приложения Netwire такова: сначала вы определяете реактивное значение, пусть назовите его simulation. В простейшем случае это чистый провод:

simulation :: WireP a [Particle]

Без подробностей (пока), как написать этот провод, позвольте мне теперь объяснить, что это такое. Тип вывода [Particle], поэтому он представляет собой реактивный список частиц. Это означает, что этот список может меняться со временем. Примечательно, что тип ввода полностью полиморфен, поэтому вы знаете, что это реактивное значение не зависит от других реактивных значений.

Теперь вы хотите получить фактическое значение списка частиц в определенные моменты времени. Здесь присутствуют функции сеанса и степпинга. В большинстве случаев приложениям требуется только одна из функций шага сессии, например stepSessionP. Вы просто вызываете эту функцию в цикле, чтобы получить текущее значение провода в этот момент. Нет необходимости постоянно вызывать эту функцию.

Вы заметите, что функция шага не дает вам [Particle], но a Either LastException [Particle]. Это связано с тем, что реактивные значения в Netwire могут ингибировать. Это концепция события. Вы знаете из законов категории, что

w . id

совпадает с просто w примерно таким же образом x + 0 совпадает с x. Идентичный провод является нейтральным относительно (.). Однако теперь представьте себе

w . myId

где myId действует как идентификационный провод, только что приводит к любой реактивной ценности, от которой он зависит, но иногда это не приводит вообще. Иногда он игнорирует значение и просто тормозит, и в этом случае сама композиция препятствует. Вы можете интерпретировать myId как проводку события и считать композицию как "w, если myId":

w . keyDown Space

Тогда у вас есть оператор выбора (<|>), который действует как "или" для событий:

w1 . ev1 <|> w2 . ev2 <|> w3

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