<div dir="ltr"><div><div><div><div><div><div><div><div><div><div>Foldable is required tor datatype to be a Traversable:<br>class (Functor t, Foldable t) => Traversable (t :: * -> *)<br><br></div>((,) a) is Functor. To be Traversable it has to be Foldable.<br><br></div>If ((,) a) is Traversable then we can write:<br></div>sequence (1, Just 2)      -- == Just (1,2)<br>sequence (1, Nothing)    -- == Nothing<br><br></div>There could be other useful classes or functions which required Foldable. <br>An other side, a tuple (with parameterized second part) can be a part of complex datatype and possibly we need Foldable or Traversable instance for that type.<br><br></div>If someone inhabits to think about tuple as a Functor, he/she can think about tuple as Foldable and Traversable as well:<br></div>fmap (+1) (1,2) == (1,3)<br></div>foldMap (+1) (1,2) == 3<br></div><br></div>There are other datatypes with similar Foldable instances. I mean a least Identity.<br></div><div>length (Identity [1,2,3]) == 1<br></div><div><br></div><br></div><div class="gmail_extra"><br><div class="gmail_quote">2017-05-03 11:41 GMT+03:00 Jonathon Delgado <span dir="ltr"><<a href="mailto:voldermort@hotmail.com" target="_blank">voldermort@hotmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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).<br>
<br>
From: Haskell-Cafe <<a href="mailto:haskell-cafe-bounces@haskell.org">haskell-cafe-bounces@haskell.<wbr>org</a>> on behalf of Tony Morris <<a href="mailto:tonymorris@gmail.com">tonymorris@gmail.com</a>><br>
Sent: 03 May 2017 08:32<br>
To: <a href="mailto:haskell-cafe@haskell.org">haskell-cafe@haskell.org</a><br>
Subject: Re: [Haskell-cafe] Foldable for (,)<br>
<div><div class="h5"> <br>
It's Foldable for ((,) a).<br>
<br>
It is not Foldable for any of these things:<br>
<br>
* (,)<br>
* tuples<br>
* pairs<br>
<br>
In fact, to talk about a Foldable for (,) or "tuples" is itself a kind<br>
error. There is no good English name for the type constructor ((,) a)<br>
which I suspect, along with being unfamiliar with utilising the<br>
practical purpose of types (and types of types) is the root cause of all<br>
the confusion in this discussion.<br>
<br>
Ask yourself what the length of this value is:<br>
<br>
[[1,2,3], [4,5,6]]<br>
<br>
Is it 6? What about this one:<br>
<br>
[(1, 'a'), (undefined, 77)]<br>
<br>
Is it 4? No, obviously not, which we can determine by:<br>
<br>
:kind Foldable :: (* -> *) -> Constraint<br>
:kind [] :: * -> *<br>
<br>
Therefore, there is no possible way that the Foldable instance for []<br>
can inspect the elements (and determine that they are pairs in this<br>
case). By this method, we conclude that the length of the value is 2. It<br>
cannot be anything else, some assumptions about length itself put aside.<br>
<br>
By this ubiquitous and very practical method of reasoning, the length of<br>
any ((,) a) is not only one, but very obviously so.<br>
<br>
On 03/05/17 17:21, Jonathon Delgado wrote:<br>
> 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é:<br>
><br>
> I've seen many threads, including the one going on now, about why we need to have:<br>
><br>
> length (2,3) = 1<br>
> product (2,3) = 3<br>
> sum (2,3) = 3<br>
> or (True,False) = False<br>
><br>
> 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?<br>
> ______________________________<wbr>_________________<br>
> Haskell-Cafe mailing list<br>
> To (un)subscribe, modify options or view archives go to:<br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
<br>
<br>
</div></div>Haskell-Cafe Info Page<br>
<a href="http://mail.haskell.org" rel="noreferrer" target="_blank">mail.haskell.org</a><br>
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.<br>
<div class="HOEnZb"><div class="h5"><br>
> Only members subscribed via the mailman list are allowed to post.<br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</div></div></blockquote></div><br></div>