On Jul 4, 2010, at 11:31 AM, Andrew Coppin wrote: >>> type family F f a :: * >>> class RFunctor f where >>> (%) :: f a b -> (a -> b) -> F f a -> F f b >>> > > I have literally no idea what a type family is. I understand ATs (I think!), > but TFs make no sense to me. > > (For this reason, most if not all of the rest of this post doesn't make > sense.)
I would have liked to use ATs here, like this: > class RFunctor f where > type F f a :: * > (%) :: f a b -> (a -> b) -> F f a -> F f b But this isn't valid as ATs require all type variables to be in scope, and 'a' isn't. There's a GHC ticket for this: http://hackage.haskell.org/trac/ghc/ticket/3714 However, I think type families are actually easier to understand than ATs, you can see them as functions on types. So: > type family F f a :: * This declares a "function" F with two arguments, f and a, which "returns" a type of kind * > type instance F BSFunctor Word8 = B.ByteString This declares that F applied to BSFunctor and Word8 is the type ByteString. So if we take all this together: > data BSFunctor :: * -> * -> * where > BS :: BSFunctor Word8 Word8 > type instance F BSFunctor Word8 = B.ByteString > instance RFunctor BSFunctor where > BS % g = B.map g It helps to write out what the type of BS % g needs to be. BS is of type BSFunctor Word8 Word8, so a and b both are Word8, and F BSFunctor a and F BSFunctor b are both B.ByteString. So the specialized type of (%) is: > BSFunctor Word8 Word8 -> (Word8 -> Word8) -> B.ByteString -> B.ByteString I admit that 'F' and '%' aren't very enlightening names. As functors map both types and functions, the following may be more readable, with TMap mapping types, and fmap mapping functions: > type family TMap f a :: * > class RFunctor f where > fmap :: f a b -> (a -> b) -> f `TMap` a -> f `TMap` b With as example the list functor: > data List a b = List > type instance List `TMap` a = [a] > instance RFunctor List where > List `fmap` f = map f I hope this helps. greetings, Sjoerd Visscher _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe