[Haskell-cafe] More experiments with ATs

Andrew Coppin andrewcoppin at btinternet.com
Sat Jul 3 10:39:28 EDT 2010

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?

More information about the Haskell-Cafe mailing list