答案 0 :(得分:5)
答案 1 :(得分:2)
不幸的是,由于wxHaskell是一个基于事件的框架,Don和ZachS的答案不适用。
这里你需要做的是分配一个可变变量,就像你在命令式语言中一样。 WxHaskell为此提供了函数variable
。这是一个(不完整的)例子:
gui = do
...
counter <- variable [value := 1 :: Int] -- allocate mutable variable
button <- button window [ text := "Count!"
, on command := next counter button]
where
next counter button = do
n <- get counter value -- get its value
set button [text := show n]
set counter [value := n+1] -- set its value
请注意,wxHaskell附带了大量example source code。特别是,wx/ImageViewer.hs
具有可变变量。
然而,除了像这样的特殊情况之外,避免像瘟疫这样的可变变量是有益的。 (事实上,他们在wxHaskell中也搞得一团糟,只是在这里很难避免。)替代方案包括重新思考代码,累积参数,使用s -> (a,s)
形式和状态monad的类型。
答案 2 :(得分:1)
答案 3 :(得分:0)
您可能还想查看Hackage上的simple-observer包。 (披露:我是软件包维护者。)
这是Observer设计模式的Haskell实现(只是用于解决“每次更改某些事情......”基于事件的框架中的问题的故障),使用MVars进行可变状态。有一篇博客文章进一步讨论here
当我遇到与你完全相同的问题时,我创建了这个包。