[Haskell-cafe] Re: Re: The Proliferation of List-Like Types
Ben Franksen
ben.franksen at online.de
Wed Feb 20 17:40:50 EST 2008
David Roundy wrote:
> On Wed, Feb 20, 2008 at 11:18:51PM +0100, Ben Franksen wrote:
>> John Goerzen wrote:
>> > On 2008-02-20, Jules Bean <jules at jellybean.co.uk> wrote:
>> >> 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.
>> >
>> > Right. In a pure abstract sense, we humans know there is a
>> > relationship between container and contents: a ByteString always
>> > contains a Word8 (or a Char8 if we choose the alternative
>> > implementation).
>> >
>> > But that is not expressed in the type of ByteString.
>>
>> Hm, making a function out of a constant is easy on the value level, just
>> use (const x) instead of (x). So, what about wrapping ByteString in a
>> GADT, like this
>>
>> data ByteString' a where
>> BS' :: Word8 -> ByteString' Word8
>>
>> ? I probably overlooked something important here...
>
> The problem is that while this would change the kind of ByteString to the
> same as the kind expected by Functor, you still couldn't define a proper
> Functor instance, since only ByteString' Word8 can ever actually be
> created. i.e. how could you implement
>
> fmapBS :: (a -> b) -> ByteString' a -> ByteString' b
Oh yes, indeed. I knew there would be a catch, somewhere...
Cheers
Ben
More information about the Haskell-Cafe
mailing list