Warum sollten wir Verhalten in FRP verwenden

Ich lerne reaktive Banane. Um die Bibliothek zu verstehen, habe ich mich entschieden, eine Dummy-Anwendung zu implementieren, die einen Zähler erhöht, wenn jemand einen Knopf drückt.

Die UI-Bibliothek, die ich verwende, ist Gtk, aber das ist für die Erklärung nicht relevant.

Hier ist die sehr einfache Implementierung, die ich mir ausgedacht habe:

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

Dies gibt nur das Ergebnis in der Shell aus. Ich kam zu dieser Lösung und las dasArtike von Heinrich Apfelmus. Beachten Sie, dass ich in meinem Beispiel kein einziges @ verwendet habBehavior.

In dem Artikel gibt es ein Beispiel für ein Netzwerk:

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

Das Beispiel zeigt einstepper das transformiert einEvent in einBehavior und bringt ein @ zurüEvent usingchanges. Im obigen Beispiel hätten wir nur @ verwenden könnEvent und ich denke, dass es keinen Unterschied gemacht hätte (es sei denn, ich verstehe etwas nicht).

So könnte jemand etwas Licht in die Benutzung von @ bringBehavior und warum? Sollen wir all @ konvertiereEvents so schnell wie möglich?

In meinem kleinen Experiment sehe ich nicht, woBehavior kann verwendet werden

Vielen Dan

Antworten auf die Frage(3)

Ihre Antwort auf die Frage