İsteğe bağlı olarak getChar
eylemini iptal etmek istiyorum. Ben aşağıdaki işlevi gerekir: Bir karakter kullanılabilir duruma gelmeden abort
denir sürece,HowChar güvenli bir şekilde nasıl iptal edilir?
getChar' :: (Char -> IO()) -> IO (IO())
abort <- getChar' callback
durumunda, bir karakter standart girdi okunur. Bir karakter okunduğunda, callback
ile çağrılır.
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
sorun killThread
kömürü okuduktan sonra ancak Mvar içine ()
koymadan önce parçacığı iptal edebilir olmasıdır:
Aşağıdaki prototip uygulama var.
Bu sorunun nasıl çözüleceğine dair bir fikrim yok, temel pakette bu mümkün mü? Değilse, diğer paketlerde uygulanan benzer bir işlev gördünüz mü?
Teşekkürler! STM ve global bir tampon burada kaçınılmaz mı? Ne düşünüyorsunuz, anlambilimden ödün vermeden de 'IO'da tanımlanmalı mı? Düzenleme: Sanırım evet çünkü 'IO' küresel duruma sahip olabilir. –
Neden "getChar" :: (Char -> IO()) -> IO (IO()) '' Prelude' veya 'System.IO'da değil, basit anlambilim var ve tanımlamak imkansız gibi görünüyor merak ediyorum Var olan yapılar ile ('Buffer' parametreniz olmadan). –
1. Evet, Haskell'de global değişkenler yaratmanın yolları var. –