[Haskell-cafe] Newbie: Is it possible to catch _|_ ?

Bjorn Bringert d00bring at dtek.chalmers.se
Tue Apr 6 18:45:28 EDT 2004


Ketil Malde wrote:
> "Russ Lewis" <spamhole-2001-07-16 at deming-os.org> writes:
> 
>> Another newbie question: Is it possible to catch _|_ - that is, to
>> encounter it, handle it and continue?
> 
> Since _|_ is the value of a non-terminating computation, this requires
> you to solve the halting problem.  GHC does occasionally detect loops,
> but for the general case, don't hold your breath :-)
> 
> -kzm

If all you are interested in is catching calls to error, they can be 
caught like normal exceptions. Here is some code from Network.XmlRpc 
that catches error calls and handles them in an error monad:

type Err m a = ErrorT String m a

-- | Evaluate the argument and catch error call exceptions
errorToErr :: Monad m => a -> Err m a
errorToErr x = let e = unsafePerformIO (tryJust errorCalls (evaluate x))
		   in ErrorT (return e)

Pretty nasty, using evaluate and unsafePerformIO in the same function. 
The essential part is (tryJust errorCalls).

/Bjorn Bringert



More information about the Haskell-Cafe mailing list