[Haskell-cafe] Bytestring map/zipWith rationale

Thomas DuBuisson thomas.dubuisson at gmail.com
Fri Sep 13 05:12:39 CEST 2013


On Thu, Sep 12, 2013 at 12:44 PM, Nicolas Trangez <nicolas at incubaid.com> wrote:
> I did use that a couple of times (`xor`ing 2 ByteStrings together), and was
> surprised by the omission back then, but IIRC (can't validate now), there's
> a specialised zipWith (as proposed) in the module (with some other name,
> obviously), which is not exported, but used when you 'pack' the result of
> 'zipWith' when the result is '[Word8]'... You might want to look into that.

This is correct - there is a RULES pragma that rewrites `pack (zipWith
f)` into a more efficient `zipWith'` function of the type desired (see
the bytestring package).  I was very concerned about this when writing
lots of bytestring xor code for crypto-api and was pleased to find
that, if the syntactic form matches, things get optimized as you
desire.

Thomas

>
> Nicolas
>
> On Sep 12, 2013 8:11 PM, "John Lato" <jwlato at gmail.com> wrote:
>>
>> Carter: we don't have both.  We have one function from each category.  My
>> guess is nobody's ever really needed a really fast zipWith ::
>> (Word8->Word8->Word8) -> ByteString -> ByteString -> ByteString; that's the
>> only reason I can think of for its omission.
>>
>>
>> On Thu, Sep 12, 2013 at 10:45 AM, Carter Schonwald
>> <carter.schonwald at gmail.com> wrote:
>>>
>>> Scott: benchmark the two and you'll see why we have both :-)
>>>
>>>
>>> On Thursday, September 12, 2013, Scott Lawrence wrote:
>>>>
>>>> On Thu, 12 Sep 2013, Tom Ellis wrote:
>>>>
>>>>> On Thu, Sep 12, 2013 at 09:21:20AM -0400, Scott Lawrence wrote:
>>>>>>
>>>>>> Something's always bothered me about map and zipWith for ByteString.
>>>>>> Why is it
>>>>>>
>>>>>>     map :: (Word8 -> Word8) -> ByteString -> ByteString
>>>>>>
>>>>>> but
>>>>>>
>>>>>>     zipWith :: (Word8 -> Word8 -> a) -> ByteString -> ByteString ->
>>>>>> [a]
>>>>>
>>>>>
>>>>> Well, what if you wanted to zipWith a function of type "Word8 -> Word8
>>>>> ->
>>>>> Foo" instead of "Word8 -> Word8 -> Word8"?
>>>>
>>>>
>>>> Then I would do what I do with map, and call `unpack` first.
>>>>
>>>> Either of the two options is usable:
>>>>
>>>>  map :: (Word8 -> Word8) -> ByteString -> ByteString
>>>>  zipWith :: (Word8 -> Word8 -> Word8) -> ByteString -> ByteString ->
>>>> ByteString
>>>>    (or)
>>>>  map :: (Word8 -> a) -> ByteString -> [a]
>>>>  zipWith :: (Word8 -> Word8 -> a) -> ByteString -> ByteString -> [a]
>>>>
>>>> I just don't understand why we have one from each.
>>>>
>>>> --
>>>> Scott Lawrence
>>>> _______________________________________________
>>>> Haskell-Cafe mailing list
>>>> Haskell-Cafe at haskell.org
>>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>
>>>
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe at haskell.org
>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>
>>
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>



More information about the Haskell-Cafe mailing list