Haskell 在gtk2hs中的事件处理程序之间切换

Haskell 在gtk2hs中的事件处理程序之间切换,haskell,event-handling,gtk,gtk2hs,Haskell,Event Handling,Gtk,Gtk2hs,我想这样做: handlerOn = do cid <- canvas `on` buttonPressEvent $ tryEvent do signalDisconnect cid handlerOff putStrLn "handlerOn" handlerOff = do cid <- canvas `on` buttonPressEvent $ tryEvent do signalDisconnect cid handlerOn

我想这样做:

handlerOn = do
  cid <- canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOff
  putStrLn "handlerOn"

handlerOff = do
  cid <- canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOn
  putStrLn "handlerOff"
handlerOn=do
cidGHC支持

或者自己管理处理程序

do ...
    h <- newIORef undefined
    let handlerOn = do
            ...
            writeIORef h handlerOff
        handlerOff = do
            ...
            writeIORef h handlerOn
    writeIORef h handlerOn
    canvas `on` buttonPressEvent $ tryEvent =<< readIORef h
做。。。

h谢谢!我正在使用第一个选项,至少对我来说,我必须添加括号,如:rec{cid…handlerOff}中所示,这样它才能工作。
handlerOff = do
  mfix $ \cid -> canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOn
  putStrLn "handlerOff"
do ...
    h <- newIORef undefined
    let handlerOn = do
            ...
            writeIORef h handlerOff
        handlerOff = do
            ...
            writeIORef h handlerOn
    writeIORef h handlerOn
    canvas `on` buttonPressEvent $ tryEvent =<< readIORef h
do ...
    ms <- newIORef False
    canvas `on` buttonPressEvent $ tryEvent do
        s <- readIORef ms
        if s
            then ...
            else ...