<div dir="ltr">It's also interesting, though, to distinguish between two questions.  You are asking whether the Foldable superclass *costs* anything.  Others are asking whether it *adds* anything.<div><br></div><div>It seems likely, as you say, that the Foldable superclass doesn't cost us any possible Traversable instances.  You can probably demonstrate this by implementing foldMap in terms of traverse and some Applicative that lets you accumulate state.  (ST?  That would definitely work, but feels like driving in a nail with a sledgehammer.)  But the superclass does force Foldable on tuples, which has cost quite a bit in the long run!</div><div><br></div><div>So what is on the benefits side of the balance?  I'm very interested in this.  Possible answers that I see are.  If a substantial number of uses of Traversable also require Foldable, then it makes them more concise.  But I am not at all sure that's the case.</div><div><br></div><div>One interesting case here is mapM versus mapM_.  The former requires Traversable, but the latter is implementable from just Foldable.  It would be a shame if you could use mapM with some types, but not mapM_.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, May 3, 2017 at 4:56 AM, MarLinn <span dir="ltr"><<a href="mailto:monkleyon@gmail.com" target="_blank">monkleyon@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF">
    <p>It's a nice challenge to come up with datatypes that could be
      Traversable but not Foldable.</p>
    <p>First of all, you can think of Traversable as an extension of
      Functor. Instead of only mapping over the structure with a pure
      function, you can now also map over it with a "functorial
      function" (a -> f b) (I don't know of a better name, so I'm
      inventing one.) What that means is to have a Traversable
      structure, you need to have the ability to touch every element. If
      you can touch every element, why would you not be able to feed
      them all into a folding function?</p>
    <p>Only a few possible anwers come to mind for me:<br>
      <br>
    </p>
    <ol>
      <li>There might be no obvious ordering. But in practice, you just
        invent one.</li>
      <li>The structure might be infinite, so folding would never
        succeed. But laziness ftw.</li>
      <li>Generalizing the previous answer, the structure might be
        computed ad-hoc and contain fixed points. That alone might not
        suffice, but it sounds like a more interesting starting point.</li>
      <li>Generalizing a bit differently, the structure might be
        computed ad-hoc… because it's IO. IO surely can't be Foldable.
        But could it be Traversable? Well… no actually, because order is
        important.</li>
    </ol>
    So can you come up with a structure that is computed ad-hoc, that
    contains fixed points, and where ordering is unimportant? Good luck.<br>
    <br>
    Cheers.<div><div class="h5"><br>
    <br>
    <br>
    <div class="m_-5852362890781121947moz-cite-prefix">On 2017-05-03 11:56, Jonathon Delgado
      wrote:<br>
    </div>
    <blockquote type="cite">
      <pre>OK, I understand why Traversable is useful here - thank you Chris and Dmitry!

The next question is why Traversable requires Foldable. I looked at the source, and couldn't see where Foldable is being used, other than as a constraint on Traversable. To put the question differently, what would fail to compile if this constraint was removed?



From: Dmitry Olshansky <a class="m_-5852362890781121947moz-txt-link-rfc2396E" href="mailto:olshanskydr@gmail.com" target="_blank"><olshanskydr@gmail.com></a>
Sent: 03 May 2017 09:53
To: Jonathon Delgado
Cc: <a class="m_-5852362890781121947moz-txt-link-abbreviated" href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a>
Subject: Re: [Haskell-cafe] Foldable for (,)
  




With fmap you can only change all values in some "container".

 With Foldable you can "fold" it, i.e. calculate some "scalar" result.

 With Traversable you can "change order of two containers":
</pre>
      <blockquote type="cite">
        <pre>sequenceA [[1,2,3],[4,5]]
</pre>
      </blockquote>
      <pre>[[1,4],[1,5],[2,4],[2,5],[3,4]<wbr>,[3,5]]
</pre>
      <blockquote type="cite">
        <pre>sequenceA ("test",[2,3,4])
</pre>
      </blockquote>
      <pre>[("test",2),("test",3),("test"<wbr>,4)]
</pre>
      <blockquote type="cite">
        <pre>sequenceA ("test",([1,2,3],[4,5,6]))
</pre>
      </blockquote>
      <pre>([1,2,3],("test",[4,5,6]))





2017-05-03 12:12 GMT+03:00 Jonathon Delgado  <a class="m_-5852362890781121947moz-txt-link-rfc2396E" href="mailto:voldermort@hotmail.com" target="_blank"><voldermort@hotmail.com></a>:
 Why do you want to traverse a tuple instead of fmap? i.e. what can you do with Foldable/Traversable for (,) that you can't do with Functor?

My background, as you can probably guess, is beginner.


From: Haskell-Cafe <a class="m_-5852362890781121947moz-txt-link-rfc2396E" href="mailto:haskell-cafe-bounces@haskell.org" target="_blank"><haskell-cafe-bounces@haskell.<wbr>org></a> on behalf of Chris Smith <a class="m_-5852362890781121947moz-txt-link-rfc2396E" href="mailto:cdsmith@gmail.com" target="_blank"><cdsmith@gmail.com></a>
Sent: 03 May 2017 08:51
To: Tony Morris
Cc: <a class="m_-5852362890781121947moz-txt-link-abbreviated" href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a>
Subject: Re: [Haskell-cafe] Foldable for (,)
 



Replying to myself, I suppose one good answer is that whether or not you care about Foldable instances for tuples, you might care about Traversable instances, and those require Foldable as a superclass.


For example, one possible specialization of `traverse` is:


    traverse :: (a -> IO b) -> (SideValue, a) -> IO (SideValue, b)


Jonathon, I don't know how much background you're coming from, so I'd be happy to explain that in more detail if you need it.


On Wed, May 3, 2017 at 1:44 AM, Chris Smith  <a class="m_-5852362890781121947moz-txt-link-rfc2396E" href="mailto:cdsmith@gmail.com" target="_blank"><cdsmith@gmail.com></a> wrote:

I'm also interested in Jonathon's question, so let me try to bring things back to the question.  Everyone agrees that there's only one reasonable way to define this instance if it exists.  But the question is: why is it defined at all?


That's an easy question to answer for Functor, Applicative, and Monad.  But I am having trouble giving a simple or accessible answer for Foldable.  Do you know one?




On Wed, May 3, 2017 at 1:32 AM, Tony Morris  <a class="m_-5852362890781121947moz-txt-link-rfc2396E" href="mailto:tonymorris@gmail.com" target="_blank"><tonymorris@gmail.com></a> wrote:
 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:
</pre>
      <blockquote type="cite">
        <pre>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?
______________________________<wbr>_________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
   <a class="m_-5852362890781121947moz-txt-link-freetext" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a>
Only members subscribed via the mailman list are allowed to post.
</pre>
      </blockquote>
      <pre>

______________________________<wbr>_________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
<a class="m_-5852362890781121947moz-txt-link-freetext" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a>
Only members subscribed via the mailman list are allowed to post.



______________________________<wbr>_________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
<a class="m_-5852362890781121947moz-txt-link-freetext" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a>
Only members subscribed via the mailman list are allowed to post.   
     
______________________________<wbr>_________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
<a class="m_-5852362890781121947moz-txt-link-freetext" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a>
Only members subscribed via the mailman list are allowed to post.</pre>
    </blockquote>
    <br>
  </div></div></div>

<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.<br></blockquote></div><br></div>