Haskell Qt'的功能性反应性模拟;s-QState机器
框架提供了一种很好的声明方式来定义有状态的基于事件的应用程序。也就是说,当事件发生时,它执行回调(实际上它触发了一个信号,但这还不够),并根据图执行状态转换 我对FRP没有任何实际经验,但通过浏览反应性香蕉的例子,我没有发现FRP是否可以解决类似的问题。例如,“两个计数器”样本通过普通if和accumB处理状态Haskell Qt'的功能性反应性模拟;s-QState机器,haskell,state-machine,frp,Haskell,State Machine,Frp,框架提供了一种很好的声明方式来定义有状态的基于事件的应用程序。也就是说,当事件发生时,它执行回调(实际上它触发了一个信号,但这还不够),并根据图执行状态转换 我对FRP没有任何实际经验,但通过浏览反应性香蕉的例子,我没有发现FRP是否可以解决类似的问题。例如,“两个计数器”样本通过普通if和accumB处理状态 那么,有没有一种干净、明确的方式来融合FSAs和FRP呢?如果我没有抓住FSAs的要点,请原谅,但我相信accumB和朋友们可以很好地、明确地捕捉到你的目标。本质上,单个状态是值,而转换
那么,有没有一种干净、明确的方式来融合FSAs和FRP呢?如果我没有抓住FSAs的要点,请原谅,但我相信
accumB
和朋友们可以很好地、明确地捕捉到你的目标。本质上,单个状态是值,而转换是函数。一个非常简单的示例可以从以下内容开始:
data ToggleState = Off | On deriving (Show)
toggle :: ToggleState -> ToggleState
toggle Off = On
toggle On = Off
emergencyShutdown :: ToggleState -> ToggleState
emergencyShutdown _ = Off
(我现在想不出捕获“开放枚举”的好主意,比如QState()
的schtick,尽管考虑到典型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
——假设eFlipSwitch和EPUSSHutdownButton是
--用户输入的定义术语;说,通过
--绑定到您喜爱的UI库。
让
eToggle::事件t(切换状态->切换状态)
eToggle=切换状态)
eShutdown=emergencyShutdown如果我没有抓住FSAs的要点,请原谅,但我相信accumB
和朋友可以很好地以声明的方式捕捉到你的目标。本质上,单个状态是值,而转换是函数。一个非常简单的示例可以从以下内容开始:
data ToggleState = Off | On deriving (Show)
toggle :: ToggleState -> ToggleState
toggle Off = On
toggle On = Off
emergencyShutdown :: ToggleState -> ToggleState
emergencyShutdown _ = Off
(我现在想不出捕获“开放枚举”的好主意,比如QState()
的schtick,尽管考虑到典型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
——假设eFlipSwitch和EPUSSHutdownButton是
--用户输入的定义术语;说,通过
--绑定到您喜爱的UI库。
让
eToggle::事件t(切换状态->切换状态)
eToggle=切换状态)
eShutdown=紧急停机