Proposal: Add conspicuously missing Functor instances for tuples

Edward Kmett ekmett at gmail.com
Tue Jan 19 23:31:05 UTC 2016


Let's do a 3-tuple because it doesn't require any contortions to find a
real usecase.

type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t

if you want to return two results from a lens, by picking f = (,,) result1
result2 you can pass it a function

a -> (result1, result2, b)

and you'll get a function

s -> (result1, result2, t)

which modifies the structure using the supplied function and gives back
both results and the final answer.

You could of course make up a completely one-off data type with local
instances and a ton of boilerplate.

You could play games with nesting tuples, and get worse operational
behavior and have an extra bottom and indirection to concern yourself with.

Or you could just use the only possible instance we can put on a 3-tuple
for Functor.

-Edward

On Tue, Jan 19, 2016 at 3:32 PM, <amindfv at gmail.com> wrote:

> El 19 ene 2016, a las 10:24, Alois Cochard <alois.cochard at gmail.com>
> escribió:
>
> +1
>
> Agree for consistency, I can also see those instances as being useful in
> some specific context, even if I agree with Andreas that in general they
> should be discouraged (especially for newcomers).
>
>
> Can you give us an example where using e.g. the Functor instance for a
> 5-tuple would be the correct/best design decision?
>
> Tom
>
>
>
> On 19 January 2016 at 09:20, Herbert Valerio Riedel <hvriedel at gmail.com>
> wrote:
>
>> On 2016-01-18 at 21:10:07 +0100, David Feuer wrote:
>> > For some reason I really can't imagine, it seems the only tuple type
>> > with a Functor instance is (,) a. I was astonished to find that
>> >
>> > fmap (+1) (1,2,3)
>> >
>> > doesn't work. Since this is *useful*, and there is *only one way to do
>> > it*, I propose we add the following:
>> >
>> > instance Functor ((,,) a b) where
>> >   fmap f (a,b,c) = (a,b,f c)
>> > instance Functor ((,,,) a b c) where
>> >   fmap f (a,b,c,d) = (a,b,c,f d)
>> > etc.
>>
>> As stated elsewhere in this thread already, there is the issue about
>> consistency. Here's a relevant section from the Haskell 2010 report[1]:
>>
>> > 6.1.4 Tuples
>> >
>> > ...
>> >
>> > However, every Haskell implementation must support tuples up to size
>> > 15, together with the instances for Eq, Ord, Bounded, Read, and Show.
>>
>> IMO, we either have no `Functor` instances for tuples at all, or we have
>> them for all tuples up to size 15. The current situations of having them
>> defined only for 2-tuples is inconsistent.
>>
>>
>> Cheers,
>>   hvr
>>
>>  [1]:
>> https://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1210006.1.4
>> _______________________________________________
>> Libraries mailing list
>> Libraries at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>
>
>
>
> --
> *Λ\ois*
> http://twitter.com/aloiscochard
> http://github.com/aloiscochard
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20160119/0e857f2d/attachment-0001.html>


More information about the Libraries mailing list