[Haskell-cafe] Foldable for (,)

MarLinn monkleyon at gmail.com
Wed May 3 09:43:10 UTC 2017


A different way to think about it is this: Given any kind of n-tuples 
that is already filled at any set of n-1 places, there are unique 
instances for the whole hierarchy (from Functor up to Traversable). For 
example there is – theoretically – a hierarchy of instances for the 
tuples (a,b,_,c,d,e).

Why isn't it defined? Because 1., we let ourselves be restrained by the 
linearity of text that "forces" us to define instances in terms of an 
arbitrary choice of order of arguments. 2., because the longer the 
tuples, the less we need it, and 3., because it's easier to wing it for 
the small tuples than to change the language. Also 4., in practice, lens.


On 2017-05-03 10:41, Jonathon Delgado wrote:
> Thank you for your explanation, but I think I'm missing something basic. Lists can have a variable length, so it makes sense to have operations that return the length or operate over a set. As ((,) a) can only have one value, the Foldable operations appear to be redundant as well as misleading (by implying that there could be more than one value).
>
> From: Haskell-Cafe <haskell-cafe-bounces at haskell.org> on behalf of Tony Morris <tonymorris at gmail.com>
> Sent: 03 May 2017 08:32
> To: haskell-cafe at haskell.org
> Subject: Re: [Haskell-cafe] Foldable for (,)
>      
> It's Foldable for ((,) a).
>
> It is not Foldable for any of these things:
>
> * (,)
> * tuples
> * pairs
>
> In fact, to talk about a Foldable for (,) or "tuples" is itself a kind
> error. There is no good English name for the type constructor ((,) a)
> which I suspect, along with being unfamiliar with utilising the
> practical purpose of types (and types of types) is the root cause of all
> the confusion in this discussion.
>
> Ask yourself what the length of this value is:
>
> [[1,2,3], [4,5,6]]
>
> Is it 6? What about this one:
>
> [(1, 'a'), (undefined, 77)]
>
> Is it 4? No, obviously not, which we can determine by:
>
> :kind Foldable :: (* -> *) -> Constraint
> :kind [] :: * -> *
>
> Therefore, there is no possible way that the Foldable instance for []
> can inspect the elements (and determine that they are pairs in this
> case). By this method, we conclude that the length of the value is 2. It
> cannot be anything else, some assumptions about length itself put aside.
>
> By this ubiquitous and very practical method of reasoning, the length of
> any ((,) a) is not only one, but very obviously so.
>
> On 03/05/17 17:21, Jonathon Delgado wrote:
>> I sent the following post to the Beginners list a couple of weeks ago (which failed to furnish an actual concrete example that answered the question). Upon request I'm reposting it to Café:
>>
>> I've seen many threads, including the one going on now, about why we need to have:
>>
>> length (2,3) = 1
>> product (2,3) = 3
>> sum (2,3) = 3
>> or (True,False) = False
>>
>> but the justifications all go over my head. Is there a beginner-friendly explanation for why such seemingly unintuitive operations should be allowed by default?
>> _______________________________________________
>> Haskell-Cafe mailing list
>> To (un)subscribe, modify options or view archives go to:
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>
> Haskell-Cafe Info Page
> mail.haskell.org
> This mailing list is for the discussion of topics related to Haskell. The volume may at times be high, as the scope is broader than the main Haskell mailing list.
>
>> Only members subscribed via the mailman list are allowed to post.
>
>      
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.



More information about the Haskell-Cafe mailing list