<div dir="auto">David put my thoughts pretty clearly: is it more useful or more confusing? I am also leaning toward more confusing. Hopefully more can weigh in on this.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 14, 2020, 7:06 PM David Feuer <<a href="mailto:david.feuer@gmail.com">david.feuer@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">No one is thankful for the Foldable instance of tuples as far as I know. Many of us tolerate it because we want the Traversable instance. But yes, you make a point about Criterion. I hadn't considered that application.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 14, 2020, 10:03 PM Travis Whitaker <<a href="mailto:pi.boy.travis@gmail.com" target="_blank" rel="noreferrer">pi.boy.travis@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Thanks for your email, David.</div><div><br></div><div>The NFData class is an important part of a large number of APIs on Hackage. According to <a href="https://packdeps.haskellers.com/reverse" rel="noreferrer noreferrer" target="_blank">https://packdeps.haskellers.com/reverse</a>, the deepseq package has over 1,200 dependent packages. In my own case, I work with a lot of record types with ForeignPtr fields. If I want to, say, use one of these types as part of a Criterion environment for a benchmark, I will need an NFData instance (<a href="https://hackage.haskell.org/package/criterion-1.5.6.1/docs/Criterion.html#v:env" rel="noreferrer noreferrer" target="_blank">https://hackage.haskell.org/package/criterion-1.5.6.1/docs/Criterion.html#v:env</a>).</div><div><br></div><div>One might argue that any potentially confusing NFData instances should be written out by hand. Maybe that's right, but now we're drifting into the same territory as discussions about Foldable (,a). I've never needed to take the length of a tuple, but the Foldable (,a) instance is lawful, so we have it in base and I wouldn't be surprised if someone, somewhere is thankful for that instance.</div><div><br></div><div>Travis</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 14, 2020 at 5:24 PM David Feuer <<a href="mailto:david.feuer@gmail.com" rel="noreferrer noreferrer" target="_blank">david.feuer@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">I think you've made an acceptable argument for these instances being *reasonable*. The question is whether they're more *useful* or more *confusing*. I'm currently leaning toward confusion. When do you actually want to `deepSeq` something with references in it? I suppose it could happen, but it's not likely to come up terribly often, is it?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 14, 2020, 7:55 PM Travis Whitaker <<a href="mailto:pi.boy.travis@gmail.com" rel="noreferrer noreferrer" target="_blank">pi.boy.travis@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Greetings Haskellers,<div><br></div><div>I am writing to draw your attention to <a href="https://github.com/haskell/deepseq/pull/50" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/haskell/deepseq/pull/50</a>.</div><div><br></div><div>This PR adds NFData instances for UArray, ForeignPtr, and TVar. The instances for ForeignPtr and TVar  have proven to be somewhat controversial. I'll refer to these as "reference types" from here on out, since similar concerns have been raised with respect to e.g. IORef. I think the arguments presented here apply equally well to IORef.</div><div><br></div><div>In summary: the argument against these instances is that rnf forces the evaluation of the reference value itself, not the value referred to by the reference. This is potentially confusing to NFData users. For example, a user might expect that calling force on a TVar value will leave the value to which the TVar refers in normal form. If this assumption doesn't hold, the user's program will leak thunks.</div><div><br></div><div>The argument for these instances is as follows: whether or not a reference value is in normal form has nothing to do with whether or not the referred-to value is in normal form. For example, consider ForeignPtr. ForeignPtr's type constructor argument is just a phantom. Each ForeignPtr value is just an Addr# with some finalizers. Whether or not these values are in normal form has nothing to do with whether or not the value the enclosed address may (or may not!) point to is in normal form. Indeed, an NFData instance for ForeignPtr, TVar, or IORef that attempted to force the referred-to value would require unsafe IO.</div><div><br></div><div>I'm curious to hear other's thoughts about these arguments. I'm hopeful that the proposed instances may be added, since I've encountered these instances as orphans on numerous occasions.</div><div><br></div><div>Thanks for your time,</div><div><br></div><div>Travis Whitaker</div></div></div></div></div></div>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" rel="noreferrer noreferrer noreferrer" target="_blank">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer noreferrer noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div>
</blockquote></div></div>
</blockquote></div>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" target="_blank" rel="noreferrer">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div>