[Haskell-cafe] Re: GUI programming
Heinrich Apfelmus
apfelmus at quantentunnel.de
Wed Feb 3 08:11:42 EST 2010
Victor Nazarov wrote:
> data Behaviour a =
> forall b. BBind (Behaviour b) (b -> Behaviour a)
> | BIO (IO a)
> | forall obj. GObjectClass obj => BWaitEvent (Event obj) (Behaviour a)
>
> instance Monad Behaviour
> where action >>= generator = BBind action generator
> return a = BIO (return a)
>
> instance MonadIO Behaviour
> where liftIO action = BIO action
>
> runBehaviour :: Behaviour a -> IO a
> runBehaviour (BBind (BWaitEvent event after) f) = runBehaviour
> (BWaitEvent event (after >>= f))
> runBehaviour (BBind (BIO a) f) = a >>= \x -> runBehaviour (f x)
> runBehaviour (BBind (BBind a f) g) = runBehaviour (a >>= (\x -> f x >>= g))
Just a minor note: you can somewhat clean up your code by using a
generic monad, as implemented in my cabal package operational
http://hackage.haskell.org/package/operational
and described in
Heinrich Apfelmus. The Operational Monad Tutorial.
In http://themonadreader.wordpress.com/2010/01/26/issue-15/
Regards,
Heinrich Apfelmus
--
http://apfelmus.nfshost.com
More information about the Haskell-Cafe
mailing list