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