Re: [Haskell-cafe] Bytestring map/zipWith rationale

2013-09-12 Thread Scott Lawrence

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@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Bytestring map/zipWith rationale

2013-09-12 Thread Tom Ellis
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"?

Tom

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Bytestring map/zipWith rationale

2013-09-12 Thread Artyom Kazak
On Thu, 12 Sep 2013 18:24:24 +0400, 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 why doesn’t map take “Word8 -> a”, but only “Word8 -> Word8”?
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Bytestring map/zipWith rationale

2013-09-12 Thread Carter Schonwald
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@haskell.org
> http://www.haskell.org/**mailman/listinfo/haskell-cafe
>
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Bytestring map/zipWith rationale

2013-09-12 Thread John Lato
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.schonw...@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@haskell.org
>> http://www.haskell.org/**mailman/listinfo/haskell-cafe
>>
>
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Bytestring map/zipWith rationale

2013-09-12 Thread Nicolas Trangez
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.

Nicolas
On Sep 12, 2013 8:11 PM, "John Lato"  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.schonw...@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@haskell.org
>>> http://www.haskell.org/**mailman/listinfo/haskell-cafe
>>>
>>
>> ___
>> Haskell-Cafe mailing list
>> Haskell-Cafe@haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>>
>
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Bytestring map/zipWith rationale

2013-09-12 Thread Thomas DuBuisson
On Thu, Sep 12, 2013 at 12:44 PM, Nicolas Trangez  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"  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
>>  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@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>
>>>
>>> ___
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe@haskell.org
>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>
>>
>>
>> ___
>> Haskell-Cafe mailing list
>> Haskell-Cafe@haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe