IOモナドに固有の次の関数を作った: memoIO :: MonadIO m => m a -> IO (m a)
memoIO action = do
ref <- newMVar Nothing
return $ do
x <- maybe action return =<< liftIO (takeMVar ref)
liftIO . putMVar
私はHaskellから呼び出すC言語で書かれた関数をいくつか持っています。これらの関数はIO (CInt)を返します。時には、それらの関数が何を返すかにかかわらず、すべての関数を実行したい場合がありますが、これは簡単です。サンプルコードのために、これは現在何が起こっているかの一般的な考え方です: Prelude> let f x = print x >> return x
Prelude> ma