
Remember, "fromJust res" won't be evaluated unless typeOf needs it.
But it does get typechecked at compile time, and the type is used to
select which instance of typeOf to call.
Fortunately, legal instances of Typeable require typeOf to not inspect
its argument.
This is a somewhat old design; modern variations on this tend to use a
"proxy type" to make it clear that the argument's value cannot be
evaluated. In modern Haskell, I would write it like so:
data Proxy a = Proxy
proxy :: a -> Proxy a
class Typeable a where
typeOf :: Proxy a -> TypeRep
-- uses ScopedTypeVariables extension
lookup :: forall a. Typeable a => TypeMap -> Maybe a
lookup (TypeMap mp) = liftM (fromJust . fromDynamic) $ Map.lookup
(typeOf (Proxy :: Proxy a)) mp
-- ryan
On Tue, Apr 27, 2010 at 5:17 PM, zaxis
newtype TypeMap = TypeMap (Map.Map TypeRep Dynamic)
lookup :: Typeable a => TypeMap -> Maybe a lookup (TypeMap mp) = res where res = liftM (fromJust . fromDynamic) $ Map.lookup (typeOf $ fromJust res) mp
It seems that the `res` in `fromJust res` has not been defined ?
Sincerely!
----- fac n = let { f = foldr (*) 1 [1..n] } in f -- View this message in context: http://old.nabble.com/A-newbie-question---tp28383563p28383563.html Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe