¿Por qué deberíamos usar Comportamiento en FRP?

Estoy aprendiendo plátano reactivo. Para entender la biblioteca, he decidido implementar una aplicación ficticia que aumentaría un contador cada vez que alguien presiona un botón.

La biblioteca de IU que estoy usando es Gtk pero eso no es relevante para la explicación.

Aquí está la implementación muy simple que se me ocurrió:

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

Esto simplemente voltea el resultado en el shell. Llegué a esta solución leyendo elartículo por Heinrich Apfelmus. Tenga en cuenta que en mi ejemplo no he usado un soloBehavior.

En el artículo hay un ejemplo de una red:

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

El ejemplo muestra unstepper que transforma unEvent en unaBehavior y trae de vuelta unEvent utilizandochanges. En el ejemplo anterior, podríamos haber usado soloEvent y supongo que no habría hecho ninguna diferencia (a menos que no esté entendiendo algo).

Entonces, ¿alguien podría arrojar algo de luz sobre cuándo usarBehavior ¿y por qué? ¿Deberíamos convertir todoEvents lo antes posible?

En mi pequeño experimento no veo dondeBehavior puede ser usado.

Gracias

Respuestas a la pregunta(3)

Su respuesta a la pregunta