runtime reflection for classes

Johannes Waldmann waldmann at imn.htwk-leipzig.de
Fri Feb 10 06:25:27 EST 2006


Donald Bruce Stewart wrote:

> Depending on how evil you are, you can already do this. Call the show,
> and if it doesn't exist you can catch the exception that is thrown 

Brilliant. By the way, this idea also solves the problem
of not being able to define defaults for record fields, like so:

import Control.Exception

data Thing = Thing { foo :: Int, bar :: Int } deriving Show

wrap :: Thing -> IO Thing
wrap x =
    ( foo x `seq` bar x `seq` return x )
    `Control.Exception.catch` \ _ ->
    ( foo x `seq` return $ x { bar = 2 } )
    `Control.Exception.catch` \ _ ->
    ( bar x `seq` return $ x { foo = 4 } )
    `Control.Exception.catch` \ _ ->
    return $ Thing { foo = 4, bar = 2 }

main = do
    wrap ( Thing { foo = 5 } ) >>= print
    wrap ( Thing { bar = 7 } ) >>= print
    wrap ( Thing {         } ) >>= print
-- 
-- Johannes Waldmann -- Tel/Fax (0341) 3076 6479/80 --
---- http://www.imn.htwk-leipzig.de/~waldmann/ -------



More information about the Haskell-prime mailing list