通常的wxHaskell程序看起来像
main = do
run gui
gui = do
....
....
gui必须有IO a
类型,运行类型为IO a -> IO ()
,run
中也有一些初始化例程。
我想做以下事情:
data AppGlobals = AG { ... some data ... }
type MApp a = StateT AppGlobals IO a
但在这种情况下,gui必须有gui :: MApp AppGlobals
类型。由于它的类型,不可能使用通常的IO monad语法,我的意思是每次执行IO操作时都要使用liftIO
。
在wxHaskell中使用State monad是否有任何方便的可能性?将状态手动传递给每个事件处理程序并不是很方便。
答案 0 :(得分:0)
我读过和写过的wxHaskell程序只是将状态推入变量 http://wxhaskell.sourceforge.net/doc/Graphics-UI-WX-Variable.html
以下是一个很好的概述: http://legacy.cs.uu.nl/daan/download/papers/wxhaskell.pdf
他们使用开始而不是跑步。
答案 1 :(得分:0)
理论上这是可能的,但我发现它在实践中很麻烦,就像你做的那样。我自己的wxHaskell代码通常看起来像我在引用的博客文章中描述的那样:
http://wewantarock.wordpress.com/2010/01/11/custom-controls-in-wxhaskell-part-3/
你可以像ja建议的那样使用wxHaskell变量用于相同的目的,尽管我更喜欢我在博客中使用的更明确的样式。