Что эквивалентно flatMap реактивной сети в реактивном банане Haskell?

Я ищу функцию в реактивном банане, которая будет выбирать, из какого потока событий выдавать следующий, в зависимости от входящего значения другого потока событий или сигнала (Поведение?). В библиотеке для scala, reactive-web это делается с помощью:

 flatMap[U](f: T => EventStream[U]): EventStream[U] 

Благодарность !


person miguel.negrao    schedule 07.04.2012    source источник


Ответы (2)


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

В частности, flatMap — это имя Scala для монадической функции связывания; экземпляр Monad для поведения проблематичен, потому что он обеспечивает функциональность динамического переключения событий, которая приводит к утечке времени, описанной в статье, на которую я ссылаюсь.

person ehird    schedule 07.04.2012
comment
Спасибо за ссылки, я думаю, это именно то, что мне нужно. Я внимательно прочитаю их. - person miguel.negrao; 07.04.2012
comment
Кстати, хотя у EventSource есть метод связывания, у него нет чистого метода, поэтому он не может быть монадой или даже аппликативом. Сигнал, с другой стороны, имеет чистую функцию, поэтому он может быть монадой и аппликативной, но я никогда не проверял, соответствует ли она свойствам монады. В реактивно-банановом Behavior нет Монады, интересно чего не хватает. - person miguel.negrao; 07.04.2012
comment
Ну, как такового ничего не пропало; это преднамеренно опущено, потому что вызывает утечку времени и семантически проблематично; в некотором смысле он имеет неправильный тип (правильный тип указан во втором посте, на который я ссылаюсь). - person ehird; 07.04.2012

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

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

person Heinrich Apfelmus    schedule 08.04.2012
comment
В примере TwoCounters.hs оба счетчика обновляются всякий раз, когда нажимаются кнопки вверх или вниз, просто значение одного из счетчиков не изменится. Я могу вспомнить много ситуаций, когда это нежелательно, поскольку излучение чего-либо может быть видимым эффектом само по себе (например, воспроизведение музыкальной ноты). Можно ли изменить этот пример таким образом, чтобы только один из счетчиков получал новое событие при нажатии кнопок вверх или вниз? - person miguel.negrao; 08.04.2012
comment
Обратите внимание, что семантика Behavior отличается от того, что вы ожидаете. Он не приходит с каким-либо понятием об этом значении было обновлено. (Существует функция changes, но это только приближение.) Вы должны использовать Event, если вам нужно выводить значения, например играть музыкальную ноту. В случае счетчика можно отфильтровать нажатия кнопок из неактивных счетчиков после их изменения. - person Heinrich Apfelmus; 09.04.2012