Por que devemos usar o comportamento no FRP

Estou aprendendo banana reativa. Para entender a biblioteca, decidi implementar um aplicativo fictício que aumentaria um contador sempre que alguém apertar um botão.

A biblioteca da interface do usuário que estou usando é Gtk, mas isso não é relevante para a explicação.

Aqui está a implementação muito simples que eu criei:

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

Isso apenas despeja o resultado no shell. Eu vim para esta solução lendo oartigo de Heinrich Apfelmus. Observe que no meu exemplo eu não usei um únicoBehavior.

No artigo, há um exemplo de rede:

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

O exemplo mostra umstepper que transforma umEvent dentro deBehavior e traz de volta umEvent usandochanges. No exemplo acima, poderíamos ter usado apenasEvent e acho que isso não faria diferença (a menos que eu não esteja entendendo alguma coisa).

Então, alguém poderia esclarecer quando usarBehavior e porque? Devemos converter todosEvents o mais rápido possível?

No meu pequeno experimento, não vejo ondeBehavior pode ser usado.

obrigado

questionAnswers(3)

yourAnswerToTheQuestion