时间:2010-07-24 18:22:19

标签: haskell wxhaskell

4 个答案:

答案 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

当我遇到与你完全相同的问题时,我创建了这个包。