Functor must be defined for all types -- not some restriction thereof (hence you see talk of indexed functors). Thus `fmap` needs to be typeable for any `a -> b` but the construcor `Moo` is only typeable at `a, b` such that we have both `Num a, Num b`. -- Jason Dusek