Proposal: Add Foldable1 from 'semigroupoids' to base

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Proposal: Add Foldable1 from 'semigroupoids' to base

Daniel Cartwright
For those of you unfamiliar with 'Foldable1', it is a typeclass for nonempty foldable structures, that centres around Semigroup instead of Monoid.
I have made a differential on Phabricator for the change here: https://phabricator.haskell.org/D4812

Some discussion at the following links also:

Note: foldl1 and foldr1 are currently typeclass methods of 'Foldable' and not 'Foldable1', and even though I think they should be, they probably (and shouldn't) be removed in this change, though I hope that eventually they can be moved to Foldable1.

Foldable1 is also unfortunately named due to the suffix '1' being connotated with the conventions surrounded Data.Functor.Classes (Show1, Eq1, etc.). If this naming is seen as sufficiently unfortunate/confusing because of that, then perhaps the name should be changed to something like 'SemiFoldable'. The name change would most likely have to be made in 'semigroupoids' first if that is the case.

_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Add Foldable1 from 'semigroupoids' to base

David Feuer
I'd be much more interested in Traversable1. Why only propose Foldable1?

On Thu, Jun 7, 2018 at 3:12 PM, Daniel Cartwright <[hidden email]> wrote:

> For those of you unfamiliar with 'Foldable1', it is a typeclass for nonempty
> foldable structures, that centres around Semigroup instead of Monoid.
> I have made a differential on Phabricator for the change here:
> https://phabricator.haskell.org/D4812
>
> Some discussion at the following links also:
>
> https://ghc.haskell.org/trac/ghc/ticket/13573
>
> https://www.reddit.com/r/haskell/comments/8p531d/ann_safefoldable_safe_wrappers_for_nullpartial/
>
> https://github.com/ekmett/semigroupoids/issues/49
>
>
> Note: foldl1 and foldr1 are currently typeclass methods of 'Foldable' and
> not 'Foldable1', and even though I think they should be, they probably (and
> shouldn't) be removed in this change, though I hope that eventually they can
> be moved to Foldable1.
>
> Foldable1 is also unfortunately named due to the suffix '1' being connotated
> with the conventions surrounded Data.Functor.Classes (Show1, Eq1, etc.). If
> this naming is seen as sufficiently unfortunate/confusing because of that,
> then perhaps the name should be changed to something like 'SemiFoldable'.
> The name change would most likely have to be made in 'semigroupoids' first
> if that is the case.
>
> _______________________________________________
> Libraries mailing list
> [hidden email]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Add Foldable1 from 'semigroupoids' to base

Edward Kmett-2
In reply to this post by Daniel Cartwright
I’m generally on board with doing this proposal, but on a pretty slow time table. Why? There is an active change I want to make to the API of semigroupoids that will require a major version bump and would affect the API for Foldable1 among other classes in the library.

The change is more or less the move to calling it Semifoldable, and refactoring Bind and Apply into Semimonad and Semiapplicative to enable users to find prior literature on the ideas behind them.

This will require a major version bump on the semigroupoids package and I’d like to see the dust settle on that before we proceed with anything that as it involves over 100 downstream dependencies having to move. Fortunately I wrote about half of them. Unfortunately, I’m doing a lot of travel for the next couple of months so it may be a bit of a community effort to get everything patched over once we decide to pull the trigger.

I prefer to make big API changes far outside of base. They are much more expensive to make after things merge in.

-Edward

On Jun 7, 2018, at 9:12 PM, Daniel Cartwright <[hidden email]> wrote:

For those of you unfamiliar with 'Foldable1', it is a typeclass for nonempty foldable structures, that centres around Semigroup instead of Monoid.
I have made a differential on Phabricator for the change here: https://phabricator.haskell.org/D4812

Some discussion at the following links also:

Note: foldl1 and foldr1 are currently typeclass methods of 'Foldable' and not 'Foldable1', and even though I think they should be, they probably (and shouldn't) be removed in this change, though I hope that eventually they can be moved to Foldable1.

Foldable1 is also unfortunately named due to the suffix '1' being connotated with the conventions surrounded Data.Functor.Classes (Show1, Eq1, etc.). If this naming is seen as sufficiently unfortunate/confusing because of that, then perhaps the name should be changed to something like 'SemiFoldable'. The name change would most likely have to be made in 'semigroupoids' first if that is the case.
_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Add Foldable1 from 'semigroupoids' to base

Andrew Martin
In reply to this post by Daniel Cartwright
You allude to the possibility of a name change at the end of the email. Progress on that is being tracked on this issue: https://github.com/ekmett/semigroupoids/issues/26. It seems like there is reasonable agreement that renaming Foldable1 (and several other classes from semigroupoids) would be good.

I'm in favor of moving this into base under the name Semifoldable (after it has been renamed in semigroupoids). Longer term, I think there's some interested stuff that could be done with fixing foldr1 and foldl1, which currently suffer a sad existence as partial functions.

On Thu, Jun 7, 2018 at 3:12 PM, Daniel Cartwright <[hidden email]> wrote:
For those of you unfamiliar with 'Foldable1', it is a typeclass for nonempty foldable structures, that centres around Semigroup instead of Monoid.
I have made a differential on Phabricator for the change here: https://phabricator.haskell.org/D4812

Some discussion at the following links also:

Note: foldl1 and foldr1 are currently typeclass methods of 'Foldable' and not 'Foldable1', and even though I think they should be, they probably (and shouldn't) be removed in this change, though I hope that eventually they can be moved to Foldable1.

Foldable1 is also unfortunately named due to the suffix '1' being connotated with the conventions surrounded Data.Functor.Classes (Show1, Eq1, etc.). If this naming is seen as sufficiently unfortunate/confusing because of that, then perhaps the name should be changed to something like 'SemiFoldable'. The name change would most likely have to be made in 'semigroupoids' first if that is the case.

_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries




--
-Andrew Thaddeus Martin

_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Add Foldable1 from 'semigroupoids' to base

Edward Kmett-2
In reply to this post by David Feuer


Sent from my iPhone

> On Jun 7, 2018, at 9:14 PM, David Feuer <[hidden email]> wrote:
>
> I'd be much more interested in Traversable1. Why only propose Foldable1?

Merging Apply/Semiapplicative into base is a much bigger move as it is a step towards making it a superclass of Applicative, and that will AMP levels of code. You need it for Traversable1/Semitraversable to make sense.

On the other hand Semifoldable is a concept you can ignore until you start using semigroups more. The community has already paid the price for refactoring their monoids. This gives them some benefit they can reap from pain already borne.

-Edward

>> On Thu, Jun 7, 2018 at 3:12 PM, Daniel Cartwright <[hidden email]> wrote:
>> For those of you unfamiliar with 'Foldable1', it is a typeclass for nonempty
>> foldable structures, that centres around Semigroup instead of Monoid.
>> I have made a differential on Phabricator for the change here:
>> https://phabricator.haskell.org/D4812
>>
>> Some discussion at the following links also:
>>
>> https://ghc.haskell.org/trac/ghc/ticket/13573
>>
>> https://www.reddit.com/r/haskell/comments/8p531d/ann_safefoldable_safe_wrappers_for_nullpartial/
>>
>> https://github.com/ekmett/semigroupoids/issues/49
>>
>>
>> Note: foldl1 and foldr1 are currently typeclass methods of 'Foldable' and
>> not 'Foldable1', and even though I think they should be, they probably (and
>> shouldn't) be removed in this change, though I hope that eventually they can
>> be moved to Foldable1.
>>
>> Foldable1 is also unfortunately named due to the suffix '1' being connotated
>> with the conventions surrounded Data.Functor.Classes (Show1, Eq1, etc.). If
>> this naming is seen as sufficiently unfortunate/confusing because of that,
>> then perhaps the name should be changed to something like 'SemiFoldable'.
>> The name change would most likely have to be made in 'semigroupoids' first
>> if that is the case.
>>
>> _______________________________________________
>> Libraries mailing list
>> [hidden email]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>
> _______________________________________________
> Libraries mailing list
> [hidden email]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Add Foldable1 from 'semigroupoids' to base

Tony Morris
In reply to this post by Edward Kmett-2
* Foldable1 -> Semifoldable
* Bind -> Semimonad
* Apply -> Semiapplicative

What other changes are required?

On Fri, Jun 8, 2018 at 5:20 AM, Edward Kmett <[hidden email]> wrote:
I’m generally on board with doing this proposal, but on a pretty slow time table. Why? There is an active change I want to make to the API of semigroupoids that will require a major version bump and would affect the API for Foldable1 among other classes in the library.

The change is more or less the move to calling it Semifoldable, and refactoring Bind and Apply into Semimonad and Semiapplicative to enable users to find prior literature on the ideas behind them.

This will require a major version bump on the semigroupoids package and I’d like to see the dust settle on that before we proceed with anything that as it involves over 100 downstream dependencies having to move. Fortunately I wrote about half of them. Unfortunately, I’m doing a lot of travel for the next couple of months so it may be a bit of a community effort to get everything patched over once we decide to pull the trigger.

I prefer to make big API changes far outside of base. They are much more expensive to make after things merge in.

-Edward

On Jun 7, 2018, at 9:12 PM, Daniel Cartwright <[hidden email]> wrote:

For those of you unfamiliar with 'Foldable1', it is a typeclass for nonempty foldable structures, that centres around Semigroup instead of Monoid.
I have made a differential on Phabricator for the change here: https://phabricator.haskell.org/D4812

Some discussion at the following links also:

Note: foldl1 and foldr1 are currently typeclass methods of 'Foldable' and not 'Foldable1', and even though I think they should be, they probably (and shouldn't) be removed in this change, though I hope that eventually they can be moved to Foldable1.

Foldable1 is also unfortunately named due to the suffix '1' being connotated with the conventions surrounded Data.Functor.Classes (Show1, Eq1, etc.). If this naming is seen as sufficiently unfortunate/confusing because of that, then perhaps the name should be changed to something like 'SemiFoldable'. The name change would most likely have to be made in 'semigroupoids' first if that is the case.
_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries



_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
Reply | Threaded
Open this post in threaded view
|

Re: Proposal: Add Foldable1 from 'semigroupoids' to base

Edward Kmett-2
Semicomonad
Semibifoldable
Semibitraversable

There is discussion about whether to rename some or all of the combinators to a semi- prefix.

There is also a longstanding discussion about what to do for the API surface of Semifoldable, etc. Can it stay with the simplistic model it has now or does it need elaboration like the Foldable API did. If I'm going to ask users to make a major version bump, I'd like to resolve this question at the same time to minimize thrashing and rework.

I'd like to get all of those things resolved in semigroupoids before it gets folded into base. Because once it is in base, that is a hell of a lot harder to deal with.

Fixing things in a third-party package with a long support window, people can just bump the bounds on their semigroupoids dependency.

Fixing them later on in base in a way that requires CPP to bridge the gap? You now lock users into CPP and into dealing with both sets of names until the old version of base drops out of whatever their arbitrarily long support window happens to be. This basically locks us into the API as that price is too high to ask someone to pay for mere administrative cleanup.

All of this indicates to me that it is generally best not refactor and merge things into a much more stable upstream library in a single step. Mistakes in that step then become much more costly.

-Edward

On Fri, Jun 8, 2018 at 2:59 AM Tony Morris <[hidden email]> wrote:
* Foldable1 -> Semifoldable
* Bind -> Semimonad
* Apply -> Semiapplicative

What other changes are required?

On Fri, Jun 8, 2018 at 5:20 AM, Edward Kmett <[hidden email]> wrote:
I’m generally on board with doing this proposal, but on a pretty slow time table. Why? There is an active change I want to make to the API of semigroupoids that will require a major version bump and would affect the API for Foldable1 among other classes in the library.

The change is more or less the move to calling it Semifoldable, and refactoring Bind and Apply into Semimonad and Semiapplicative to enable users to find prior literature on the ideas behind them.

This will require a major version bump on the semigroupoids package and I’d like to see the dust settle on that before we proceed with anything that as it involves over 100 downstream dependencies having to move. Fortunately I wrote about half of them. Unfortunately, I’m doing a lot of travel for the next couple of months so it may be a bit of a community effort to get everything patched over once we decide to pull the trigger.

I prefer to make big API changes far outside of base. They are much more expensive to make after things merge in.

-Edward

On Jun 7, 2018, at 9:12 PM, Daniel Cartwright <[hidden email]> wrote:

For those of you unfamiliar with 'Foldable1', it is a typeclass for nonempty foldable structures, that centres around Semigroup instead of Monoid.
I have made a differential on Phabricator for the change here: https://phabricator.haskell.org/D4812

Some discussion at the following links also:

Note: foldl1 and foldr1 are currently typeclass methods of 'Foldable' and not 'Foldable1', and even though I think they should be, they probably (and shouldn't) be removed in this change, though I hope that eventually they can be moved to Foldable1.

Foldable1 is also unfortunately named due to the suffix '1' being connotated with the conventions surrounded Data.Functor.Classes (Show1, Eq1, etc.). If this naming is seen as sufficiently unfortunate/confusing because of that, then perhaps the name should be changed to something like 'SemiFoldable'. The name change would most likely have to be made in 'semigroupoids' first if that is the case.
_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries



_______________________________________________
Libraries mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries