[Haskell] Re: reflection/metadata in Haskell?

Stefan Holdermans stefan at cs.uu.nl
Fri Sep 23 03:55:00 EDT 2005


Srinivas,


> mkT :: (Typeable a, Typeable b) => (b -> b) -> a -> a
> mkT f = case cast f of
>                 Just g -> g
>                 Nothing -> id
>
>  From the definition of cast and the examples given earlier it looks
> like cast needs to be told what the target type (a here) is in  
> order to
> know what its trying to cast to  - hence the example was "(cast
> 'a')::Maybe Char" - which makes sense. So I dont quite understand the
> usage of cast presented here inside mkT. How does the case proceed
> without knowing what its trying to cast f to?

Well, it can proceed because all type information it really needs is  
available.

Just consider:

The explicit signature reveals that mkT has type

   (b -> b) -> a -> a

(for any a and b that are instances of Typeable).

Using this information we derive that f in

   mkT f = ...

is a function of type b -> b, right?

Then the right-hand side: that one should give us a function of type  
a -> a. Just skip the first part of the case statement for a while  
and proceed to its body:

   mkT f = case ... of
             Just g  -> g
             ...

Since, g has to have type a -> a and Just has type t -> Maybe t for  
all t, it follows that Just g has type Maybe (a -> a). Therefore the  
case statement should perform pattern matching on a value of type  
Maybe (a -> a). So, from

   mkT f = case cast f of
             Just g -> g
             ...

it can be inferred that cast f has type Maybe (a -> a) and, hence,  
that cast should try to case f to a function of type a -> a.

HTH,

Stefan


More information about the Haskell mailing list