[Haskell-cafe] Foldable for (,)
cdsmith at gmail.com
Wed May 3 08:51:44 UTC 2017
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 <cdsmith at gmail.com> 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 <tonymorris at gmail.com> 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:
>> > 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
>> > 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:
>> Only members subscribed via the mailman list are allowed to post.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe