2013-11-21 59 views
1

QStateMachine框架提供了一个很好的声明方式来定义基于状态事件的应用程序。即然后发生一个事件它执行一个回调(实际上它触发一个信号,但这是不够的),并根据该图执行状态转换。Qt的QStateMachine功能反应模拟

我对玻璃钢没有任何实际经验,但通过浏览反应香蕉的例子,我没有发现玻璃钢是否能解决类似的问题。例如,如果和accumB,“两个计数器”样本处理状态为明码

那么,有没有一种干净的声明方式来融合FSA和FRP?

回答

1

对不起,如果我错过了FSA的观点,但我相信accumB和朋友们可以很好地和声明地捕捉你所瞄准的目标。实质上,个体状态是价值观,转变是功能。一个非常简单的例子可能首先:

data ToggleState = Off | On deriving (Show) 

toggle :: ToggleState -> ToggleState 
toggle Off = On 
toggle On = Off 

emergencyShutdown :: ToggleState -> ToggleState 
emergencyShutdown _ = Off 

(没有好点子捕捉“开放枚举”的QState()般滑稽特点发生到我现在,但我想这是不是一个真正的大问题,考虑到。偏爱典型Haskeller的强类型)

然后,我们建立了FRP网络,拍摄时的行为(即随时间变化的值)和转换为事件:

-- Assuming eFlipSwitch and ePushShutdownButton are 
-- defined terms of user input; say, through 
-- bindings to your favourite UI library. 
let 
    eToggle :: Event t (ToggleState -> ToggleState) 
    eToggle = toggle <$ eFlipSwitch 

    eShutdown :: Event t (ToggleState -> ToggleState) 
    eShutdown = emergencyShutdown <$ ePushShutdownButton 

    -- By defining the behavior, we state once and for all the 
    -- temporal evolution of the state in terms of the transitions. 
    bState :: Behavior t ToggleState 
    bState = accumB Off $ eToggle `union` eShutdown 

还有许多其他的可能性。 IO回调可以通过reactimate的事件触发。如QStateMachine文档中所述,可以使用filterE和相关组合器完成后卫。动画UI元素可以通过绑定模块轻松完成(在reactive-banana-wx中查找sink,或者就此而言,可以使用3penny-gui)。等等。