-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add one arg function composition #34251
Merged
Merged
Changes from 2 commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
85a4924
add zero and one arg function composition
jw3126 326b1fe
add function composition news and compat
jw3126 5289aab
remove empty function composition
jw3126 6458eb9
fix
jw3126 ae03f24
fix
jw3126 1630d32
fix
jw3126 fffce8a
fix
jw3126 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if this is the best way. For example,
∘(f, g, ∘())
may not work out-of-the-box iff
andg
are generic morphisms like lenses or transducers. It's the same reason why we don't have+()
or*()
. OTOH, it's nice that we have a canonical identity for∘
. I guess I'd be less worried ifare implemented as well.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That is a very good observation. My favored solution would be dropping
∘()
and adding your remark as a comment I think.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Or perhaps
∘() = error(your remark)
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's based on the desire to have
∘
for other "morphisms" than functions, which has been requested before, e.g. in the discussion wherecompose
was requested as an ASCII name for∘
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Adding only
∘(f)
sounds good. Adding things is much easier than removing things.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would also be fine with just adding the definitions you proposed:
So I guess we have two options: less or more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree. I'm also fine with both choices.
I actually like adding that three-line definition with
::typeof(identity)
. It makes writing morphisms slightly easier. But this can happen independently of∘()
. If we need some excuse for adding that three-line definition, and if∘()
is enough for that, then I'd vote for adding∘()
. Yeah, that's a bit 😈There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While I can live with both choices, here are some arguments why less is more:
I take lens composition as an example, but this applies to transducers and probably most kinds of morphisms.
lens = ∘(lenses...)
I expect that I can use the lens api on the result. Likeget(obj, lens)
. This is impossible to achieve for the empty case. Now defining∘() = identity
(along with @tkf clever extra methods say) means that some part of the lens will work e.g∘(lens, ∘())
and others will not.I would favor if everything fails at composition time with a sane error and not having some stuff work and other stuff throw a latent error about using lens api on
identity
.::Lens
). In order to make things work, one must also define e.g.Not the end of the world, but having two identities is an extra stumbling block package authors need to keep in mind.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These are very good points. I'm now against
∘()
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, so let's go with the less option then: remove the
∘()
method and fix up the docs to correspond to that and this should be good to go.