8

getCharオプションでアクションを中止したいと思います。次の機能が必要です。

getChar' :: (Char -> IO ()) -> IO (IO ())

の場合、文字が使用可能になる前に が呼び出されabort <- getChar' callbackない限り、文字は標準入力から読み取られます。abort文字が読み込まcallbackれると、それとともに呼び出されます。

次のプロトタイプ実装があります。

import Control.Monad
import Control.Concurrent

getChar' :: (Char -> IO ()) -> IO (IO ())
getChar' callback = do
    v <- newEmptyMVar
    tid <- forkIO $ do
        c <- getChar
        b <- tryPutMVar v ()
        when b $ callback c
    return $ do
        b <- tryPutMVar v ()
        when b $ killThread tid

問題は、文字を読み取った後、MVarkillThreadに入れる前にスレッドを中止する可能性があることです。()

この問題を解決する方法がわかりません。基本パッケージで可能ですか? そうでない場合、他のパッケージで同様の機能が実装されているのを見たことがありますか?

4

2 に答える 2

0

やりたいことは、例外に関係なく、MVar が常に安全な状態のままになるような例外処理構造を使用することです。特に、おそらく必要ですwithMVar

于 2013-05-27T10:55:09.837 に答える