2

私はこのようなことをしたいと思います:

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"

もちろん、cidがまだ割り当てられていないコードブロック内でcidを使用しようとしているため、これはそのままでは機能しません。

アイデアは、イベントを受信すると、それ自体を登録解除し、同じことを行う別のイベントリスナーを登録するイベントリスナーを登録することです。

4

1 に答える 1

5

GHC はrecursivedoをサポートしています。

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

を使用することもできますControl.Monad.Fix

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 ...
于 2011-02-24T21:57:03.947 に答える