On Wed, Sep 11, 2013 at 7:15 AM, Duncan Coutts <duncan.coutts@googlemail.com> wrote:
On Wed, 2013-09-11 at 15:56 +0200, Nicolas Trangez wrote:
> I looked into this when this thread started, but bumped into at least
> one 'issue': when defining (OTOH) something like
>
> import qualified Data.ByteString as BS
> import qualified Data.ByteString.Char8 as BS8
>
> class Foldable t where
>     type Elem c :: *
>     foldr :: (Elem t -> b -> b) -> b -> t -> b
>
> instance Foldable BS.ByteString where
>     type Elem BS.ByteString = Word8
>     foldr = BS.foldr
>
> instance Foldable BS8.ByteString where
>     type Elem BS8.ByteString = Char
>     foldr = BS8.foldr
>
> which fails because BS.ByteString and BS8.ByteString are the same.

Right. I fear there's very little one could do about that. We do have
one single type that is a specialised container for two types. That's
fairly unusual. I'd probably just use Word8, especially since Char stuff
is a bit iffy since it's really "Char8" not a full Char.

It happens in containers and unordered-containers as well and I suspect we will see it any time we want both a lazy and strict (in the container sense) version of a data type.

-- Johan