At 2002-02-20 22:15, I wrote (on the Haskell list):

>Haskell? Given this:
>
>    class (Monad m) => PeirceMonad m where
>               {
>               peirceM :: ((a -> m b) -> m a) -> m a;
>               };
>
>...which Monads can be made PeirceMonads?

This is untested, but...

    instance PeirceMonad IO where
        {
        peirceM foo = do
            {
            ref <- newIORef Nothing;
            catch (foo (\a -> do
                {
                writeIORef ref (Just a);
                ioError (userError "break");
                }))
                (\ex -> do
                {
                ma <- readIORef ref;
                case ma of
                    {
                    Just a -> return a;
                    _ -> ioError ex;
                    };
                })
            }
        };

So you can do it if you have refs and throw/catch for your monad. I think.


-- 
Ashley Yakeley, Seattle WA

_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to