リアクティブバナナを学んでいます。ライブラリを理解するために、誰かがボタンを押すたびにカウンターを増加させるダミー アプリケーションを実装することにしました。
私が使用している 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
この例は、stepper
を に変換し、を使用してを戻すEvent
aを示しています。上記の例では、 のみを使用できましたが、違いはなかったと思います (私が何かを理解していない場合を除きます)。Behavior
Event
changes
Event
では、いつ、どのような理由で使用するのか、誰かが光を当てることができますBehavior
か? Event
すべての s をできるだけ早く変換する必要がありますか?
Behavior
私の小さな実験では、どこで使用できるかわかりません。
ありがとう