Readline read_history and write_history addition
judah.jacobson at gmail.com
Sat Feb 2 17:05:50 EST 2008
On Sat, Feb 2, 2008 at 1:14 PM, Yitzchak Gale <gale at sefer.org> wrote:
> Alexander Dunlap wrote:
> >>> For instances where an exception would be too intrusive, I don't see
> >>> how it would be too hard to write a wrapper function
> I wrote:
> >> In a library that does not have direct access to the IO
> >> monad, it would be not just hard - it would be impossible.
> >> That is because of type restrictions in the current versions
> >> of catch, block, and friends.
> Judah Jacobson wrote:
> > You haven't said why something like the following would not be sufficient:
> > readHistoryM :: MonadIO m => String -> m Bool
> > readHistoryM file = liftIO $ do
> > result <- try (readHistory file)
> > return (result == Right ())
> Because a library - other than readline itself - can't
> force its users to do that.
> OK. Here's a simplified real-world example. Say you want to
> write a simple library that interfaces the text-to-speech facilities
> available on multiple platforms. To play nicely with programs
> written in a monadic style, the interface might be something like:
> class MonadIO m => Speech m where
> sayText :: String -> m ()
> runSpeech :: m a -> IO a
> instance Speech SomeSpeechSystem where
> sayText t = ...
> runSpeech x = do
> liftIO startSomeSpeechSystem
> ret <- x
> liftIO stopSomeSpeechSystem
> return ret
> Unfortunately, bracket is not available. So if x throws an
> uncaught IO exception, you may leave around zombies,
> database corruption, missiles armed for launch, etc.
I've already demonstrated how a library writer can solve that problem in:
More information about the Libraries