Currently we have

 class Functor c where
   fmap :: (x -> y) -> (c x -> c y)

This relies on c having kind * -> *. For example, Bytestring cannot be an instance of Functor.

A cleaner solution would be to have something like

 class Container c where
   type Element c :: *

I then attempted to write

 class Container c => Functor c where
fmap :: (Functor cx, Functor cy, Element cx ~ x, Element cy ~ y) => (x -> y) -> (cx -> cy)

However, this fails horribly: The type signature fails to mention c. And even if it did, this type signature still isn't correct: It says that fmap can transform *any* functor into *any* other functor, which is wrong.

It seems that we have gained the ability to talk about containers holding any type of value (even hard-coded types or types with class constraints), but lost the ability to refer to a particular "type of" functor without also specifying the element type.

Does anybody know a straightforward way to fix this? Or is this just a dead end?

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to