Семантически, у вас есть
Behavior a = Time -> a
То есть Behavior a
- это значение типа a
, которое изменяется во времени. В общем, вы ничего не знаете о , когда a Behavior a
изменится, так что это оказывается довольно неудачным выбором для обновления текстового поля нажатием кнопки. Тем не менее, было бы легко получить поведение, которое выражает текущее значение числа в примере счетчика. Просто используйте stepper
в потоке событий или, альтернативно, создайте его с нуля таким же образом, за исключением использования accumB
вместо accumE
.
Обычно вещи, которые вы подключаете к вводу и выводу, всегда будут Event
с, поэтому Behavior
используется внутри для промежуточных результатов.
Предположим, что в данном примере вы хотите добавить новую кнопку, которая запоминает текущее значение, как функция памяти на простых калькуляторах. Начните с добавления кнопки памяти и текстового поля для запомненного значения:
bmem <- button f [text := "Remember"]
memory <- staticText f []
Вы должны иметь возможность запрашивать текущее значение в любое время, поэтому в вашей сети вы должны добавить поведение для его представления.
let currentVal = stepper 0 counter
Затем вы можете подключить события и использовать apply
для чтения значения поведения каждый раз, когда нажимается кнопка «Запомнить», и создавать Событие с этой последовательностью значений.
emem <- event0 bmem command
let memoryE = apply (const <$> currentVal) emem
И, наконец, подключите это новое событие к выводу
sink memory [text :== ("", show <$> memoryE)]
Если вы хотите использовать память для внутреннего использования, вам снова понадобится Behavior
для ее текущего значения ... но поскольку мы используем его только для подключения к выходу, нам нужно только событие на данный момент .
Это помогает?