QStateMachine框架提供了一个很好的声明方式来定义基于状态事件的应用程序。即然后发生一个事件它执行一个回调(实际上它触发一个信号,但这是不够的),并根据该图执行状态转换。Qt的QStateMachine功能反应模拟
我对玻璃钢没有任何实际经验,但通过浏览反应香蕉的例子,我没有发现玻璃钢是否能解决类似的问题。例如,如果和accumB,“两个计数器”样本处理状态为明码。
那么,有没有一种干净的声明方式来融合FSA和FRP?
QStateMachine框架提供了一个很好的声明方式来定义基于状态事件的应用程序。即然后发生一个事件它执行一个回调(实际上它触发一个信号,但这是不够的),并根据该图执行状态转换。Qt的QStateMachine功能反应模拟
我对玻璃钢没有任何实际经验,但通过浏览反应香蕉的例子,我没有发现玻璃钢是否能解决类似的问题。例如,如果和accumB,“两个计数器”样本处理状态为明码。
那么,有没有一种干净的声明方式来融合FSA和FRP?
对不起,如果我错过了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)。等等。