Как вы получаете содержимое элементов пользовательского интерфейса при использовании реактивного банана? Event0 возвращает событие типа Event ()
, которое имеет тип единицы вместо типа элемента управления. event1 принимает событие типа Event w (a -> IO ())
, но команда имеет тип Event w (IO ())
. mapAccumE и mapAccumB принимают в качестве параметров чистые функции, поэтому get text foo
нельзя использовать с ними.
Ввод пользовательского интерфейса с реактивным-бананом-wx
Ответы (2)
По сути, вы хотите работать с функциями, а не с данными. Если вы думаете: «Как мне создать поведение, которое имеет текущий текст в поле», вы этого не сделаете. Вместо этого вы пишете функции, которые принимают текущий текст в качестве параметра и передают его при необходимости. Предположим, вы хотите распечатать содержимое текстового поля при нажатии кнопки. Тогда вы бы сделали что-то вроде этого:
eButton :: NetworkDescription (Event ())
eButton = event0 button command
network = do
pressButton <- eButton
reactimate $ (\() -> get text foo >>= print) <$> pressButton
Если вам нужно получить входные данные в поведение, вы можете аналогичным образом использовать функцию с типом Behavior (String -> a)
(или любым другим типом, который вам нужен), а затем просто передать строку в точке вызова reactimate
.
(Автор reactive-banana говорит. Извините за поздний ответ, возможны вопросы тут даже в голову не пришло. :-))
Сегодня я обнаружил, что упустил из библиотеки очень важную функцию: получение содержимого элемента пользовательского интерфейса в виде файла Behavior
. Стыдно! :-Д
Джон описывает текущий обходной путь, но следующая версия реактивного -банан будет включать недостающую функцию.
РЕДАКТИРОВАТЬ: я выпустил реактивную банановую версию 0.4. который теперь включает функциональность в виде функции
fromPoll :: IO a -> NetworkDescription (Behavior a)