Почему мы должны использовать поведение в FRP

Я учу реактивный банан. Чтобы понять библиотеку, я решил реализовать фиктивное приложение, которое бы увеличивало счетчик всякий раз, когда кто-то нажимает кнопку.

Я использую библиотеку пользовательского интерфейса Gtk, но это не имеет отношения к объяснению.

Вот очень простая реализация, которую я придумал:

import Graphics.UI.Gtk
import Reactive.Banana
import Reactive.Banana.Frameworks

makeNetworkDescription addEvent = do
    eClick <- fromAddHandler addEvent
    reactimate $ (putStrLn . show) <
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
gt; (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

Это просто выводит результат в оболочку. Я пришел к этому решению, читаястатья Генрих Апфельмус. Обратите внимание, что в моем примере я не использовал ни одногоBehavior.

В статье приведен пример сети:

makeNetworkDescription addKeyEvent = do
    eKey <- fromAddHandler addKeyEvent
    let
        eOctaveChange = filterMapJust getOctaveChange eKey
        bOctave = accumB 3 (changeOctave <
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
gt; eOctaveChange) ePitch = filterMapJust (`lookup` charPitches) eKey bPitch = stepper PC ePitch bNote = Note <
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
gt; bOctave <*> bPitch eNoteChanged <- changes bNote reactimate' $ fmap (\n -> putStrLn ("Now playing " ++ show n)) <
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
gt; eNoteChanged

Пример показываетstepper это превращаетEvent вBehavior и возвращаетEvent с помощьюchanges, В приведенном выше примере мы могли бы использовать толькоEvent и я думаю, что это не имело бы никакого значения (если я чего-то не понимаю).

Так может кто-то может пролить свет на то, когда использоватьBehavior и почему? Должны ли мы преобразовать всеEventкак можно скорее?

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

Спасибо

Ответы на вопрос(3)

Ваш ответ на вопрос