[Haskell-cafe] hMapping polymorphic functions
mutjida at gmail.com
Sun Jul 15 22:51:45 EDT 2007
I am experimenting with type-level HList based programming.
The Apply class:
class Apply f a r | f a -> r where
apply :: f -> a -> r
apply = undefined -- In case we use Apply for
-- type-level computations only
-- Normal function application
instance Apply (x -> y) x y where
apply f x = f x
makes it seem like it should be possible to hMap:
class HMap f l l' | f l -> l'
hMap :: f -> l -> l'
instance HMap f HNil HNil
hMap f HNil = HNil
Apply f x y,
HMap f xs ys
=> HMap f (HCons x xs) (HCons y ys)
hMap f (HCons x xs) = HCons (apply f x) (hMap f xs)
a (term-level) polymorphic function over a HList. As written it
doesn't work at all. A (local) functional dependency to say that the
function determines its argument type is missing.
Towards this end I changed the Apply instance to:
instance TypeCast a' a => Apply (a -> b) a' b
where apply f x = f (typeCast x)
This change allows me to apply a polymorphic function to elements of
an HList by hand:
(\(f :: forall a. a -> [a]) -> HCons (f 'a') (HCons (f "a") HNil))
(\x -> [x])
However, I need to explicitly write the polymorphic type of the
argument f. Thus I cannot use hMap.
So I have two questions:
1) Am I missing something?
2) Is there some way to pass an arbitrary (i.e. don't know explicit
type at compile time) polymorphic function as an argument to another
More information about the Haskell-Cafe