【问题标题】:Reactive Banana: Alternate buttons eventsReactive Banana:备用按钮事件
【发布时间】:2015-11-25 23:38:19
【问题描述】:

我第一次尝试使用 Reactive Banana (WX) 在五个按钮之上显示诸如“按下按钮一”、“按下按钮二”等文本:

{-# LANGUAGE ScopedTypeVariables #-}

import Graphics.UI.WX hiding (Event)
import Reactive.Banana
import Reactive.Banana.WX

data Buttons = One | Two | Three | Four | Five deriving (Show)

main :: IO ()
main = start $ do
  f      <- frame [text := “Five Buttons“]
  bone   <- button f [text := “One”]
  btwo   <- button f [text := “Two”]
  bthree <- button f [text := “Three”]
  bfour  <- button f [text := “Four”]
  bfive  <- button f [text := “Five”]
  out    <- staticText f []

  set f [layout := margin 10 $
          column 5 [row 5 [widget bone, widget btwo, widget bthree, widget bfour, widget bfive],
                    grid 5 5 [[label “Output:” , widget out]
                              ]]]

  let networkDescription :: forall t. Frameworks t => Moment t ()
      networkDescription = do
        eone   <- event0 bone   command
        etwo   <- event0 btwo   command
        ethree <- event0 bthree command
        efour  <- event0 bfour  command
        efive  <- event0 bfive  command

        let
          somethinghere::Behaviour t Buttons
          somethinghere = ....
        sink out [text :== "Pressed button " ++ show <$> somethinghere]

  network <- compile networkDescription    
  actuate network

代码只是主要的骨架。我目前无法做的是填写somethinghere 方法。如前所述,如果按下按钮“One”,则 somethinghere 应该返回引用 Buttons ADT 数据 One 等等。 我尝试使用accumBunionWith,但我认为我的机制并不正确。有什么帮助吗?

【问题讨论】:

    标签: haskell wxwidgets frp reactive-banana


    【解决方案1】:

    我相信你想要这样的东西:

    let eChangeSelection :: Event t Buttons
        eChangeSelection = unions
            [ One <$ eone
            , Two <$ etwo
            , Three <$ ethree
            , Four <$ efour
            , Five <$ efive
            ]
    
        -- Your `somethinghere`:
        bSelection :: Behavior t Buttons
        bSelection = stepper One eChangeSelection
    

    bSelection 代表当前选择的按钮,eChangeSelection 是它的更新流。 unions 合并五个事件流,(&lt;$) 用适当的值标记每个单独的流。请注意,我随意选择了One作为初始选择值;您可能更喜欢做一些不同的事情(例如,使用Behavior t (Maybe Buttons) 以便可以不选择按钮)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多