[Haskell-cafe] Re: The Proliferation of List-Like Types

Jules Bean jules at jellybean.co.uk
Wed Feb 20 12:55:54 EST 2008

John Goerzen wrote:
> On 2008-02-20, John Goerzen <jgoerzen at complete.org> wrote:
>> I notice that Data.Foldable does some similar things but does not use
>> multi-parameter type classes.  I seem to recall that I attempted to do
>> this in the same manner, but got tripped up somewhere.  I can't
>> remember now exactly what the problem was, but I can go back and look
>> if nobody knows off-hand.
> I went back and looked.
> The problem is that ByteString doesn't work as a member of Foldable,
> or of ListLike without it being MPTC.  Trying to do so yields:
> ListLike.hs:217:20:
>     Kind mis-match
>     Expected kind `* -> *', but `BS.ByteString' has kind `*'
>     In the instance declaration for `F.Foldable BS.ByteString'
> Is there any way around that, other than MPTC?

Not directly, no.

The point about Foldable, Functor, and Monad, is that they enforce the 
connection between container and contents. If the contents is of type 
"a", the container is of type "f a" for a fixed type constructor 'f'. 
This works for [], Seq, and so on, but fails for ByteString.

To go to the next level, for ByteString you either need type-level 
functions (to generalise 'f' from "type constructor" to "arbitrary 
function :: * -> *"), or MPTCs (to make the association between 
container and contents explicit).

However, passing around dictionaries is certainly a solution which works 
in haskell98. I haven't thought it through enough to see if it would be 
unpleasantly verbose in practice.


More information about the Haskell-Cafe mailing list