Я изучаю реактивный банан. Чтобы понять библиотеку, я решил реализовать фиктивное приложение, которое увеличивало бы счетчик всякий раз, когда кто-то нажимает кнопку.
Библиотека UI, которую я использую, - это Gtk, но это не относится к объяснению.
Вот очень простая реализация, с которой я столкнулся:
import Graphics.UI.Gtk
import Reactive.Banana
import Reactive.Banana.Frameworks
makeNetworkDescription addEvent = do
eClick <- fromAddHandler addEvent
reactimate $ (putStrLn . show) <$> (accumE 0 ((+1) <$ eClick))
main :: IO ()
main = do
(addHandler, fireEvent) <- newAddHandler
initGUI
network <- compile $ makeNetworkDescription addHandler
actuate network
window <- windowNew
button <- buttonNew
set window [ containerBorderWidth := 10, containerChild := button ]
set button [ buttonLabel := "Add One" ]
onClicked button $ fireEvent ()
onDestroy window mainQuit
widgetShowAll window
mainGUI
Это просто выдает результат в оболочке. Я подошел к этому решению, прочитав статью статью Heinrich Apfelmus. Обратите внимание, что в моем примере я не использовал ни одного Behavior
.
В статье приведен пример сети:
makeNetworkDescription addKeyEvent = do
eKey <- fromAddHandler addKeyEvent
let
eOctaveChange = filterMapJust getOctaveChange eKey
bOctave = accumB 3 (changeOctave <$> eOctaveChange)
ePitch = filterMapJust (`lookup` charPitches) eKey
bPitch = stepper PC ePitch
bNote = Note <$> bOctave <*> bPitch
eNoteChanged <- changes bNote
reactimate' $ fmap (\n -> putStrLn ("Now playing " ++ show n))
<$> eNoteChanged
В примере показан a stepper
, который преобразует Event
в Behavior
и возвращает Event
с помощью changes
. В приведенном выше примере мы могли бы использовать только Event
, и я предполагаю, что это не имело бы никакого значения (если я не что-то не понимаю).
Так может кто-то может пролить свет на то, когда использовать Behavior
и почему? Должны ли мы преобразовать все Event
как можно скорее?
В моем маленьком эксперименте я не вижу, где можно использовать Behavior
.
Спасибо