Docs for Func and AppFunc#4378
Conversation
|
I think the doc needs to start with the fact that shape looks almost identical to The issue links to a blog post and explains it and maybe we can just reuse some of the explanation. A very short summary may be that Kleisli is about sequential composition of functions while Func (poorly named) is about parallel compositions of functions. I appreciate your PR, but I think re-explaining other core typeclasses (Applicative, Traverse) shouldn't go in here. |
|
I was hesitant to mention that. I had written something about it, but though that, given that AppFunc is "more general" than Kleisli it would be confusing to mention Kleisli for someone unfamiliar to it. |
|
Ok, I mentioned the similarities with Kleisli and removed over explanation of traverse, just left the link to the applicative docs and an example |
reardonj
left a comment
There was a problem hiding this comment.
docs/datatypes/directory.conf needs to be updated with a reference to this page.
I left some small fixup suggestions as well, but I have to wonder if this article would be more useful if it started by introducing AppFunc directly, then discussing Func as a weaker version after (similar to how Apply is described in the Applicative article). With the current version, the motivation for caring (how to: compose applicative functors), is buried really deep.
| @@ -0,0 +1,78 @@ | |||
| # Func | |||
There was a problem hiding this comment.
A link to the scaladoc should be added now that #4401 is merged.
| @@ -0,0 +1,78 @@ | |||
| # Func | |||
There was a problem hiding this comment.
Since AppFunc is so important here, maybe the title should be "Func and AppFunc"? Some of the typeclasses are done this way.
|
|
||
| # AppFunc | ||
|
|
||
| AppFunc extends Func to wrap around a special type of functor: Applicative functors. |
There was a problem hiding this comment.
May as well link to the section for reference.
| AppFunc extends Func to wrap around a special type of functor: Applicative functors. | |
| AppFunc extends Func to wrap around a special type of functor: [Applicative] functors. |
|
|
||
| Signature: `AppFunc[F[_], A, B] extends Func[F, A, B]` | ||
|
|
||
| Now, for the reader familiar with `Kleisli`, we find an even more similar data type. `AppFunc` provides compositions of weaker constraint, allowing to compose `AppFunc[F[_], A, B]` with `AppFunc[G[_], C, A]`. |
There was a problem hiding this comment.
I don't think these Kleisli call outs are going to help people trying to figure out what AppFunc is for. Have you considered having a comparison to Kleisli section at the end of the article?
There was a problem hiding this comment.
Hey, yes actually I think at the beginning it was at the end but a suggestion was to move it to the beginning. Given that most doubts in the PR introducing the code were around "why do we need this if Kleisli is a thing"
There was a problem hiding this comment.
Ha, I guess that's down to a matter of audience. For cats newcomers, Kleisli is probably at least as foreign as this.
Co-authored-by: Justin Reardon <me@jmreardon.com>
Co-authored-by: Justin Reardon <me@jmreardon.com>
Co-authored-by: Justin Reardon <me@jmreardon.com>
Co-authored-by: Justin Reardon <me@jmreardon.com>
Co-authored-by: Justin Reardon <me@jmreardon.com>
Hey, I saw your suggestions and applied almost all, only question the one about Kleisli, let me know what you think. |
reardonj
left a comment
There was a problem hiding this comment.
Now that I've read it, the new Kleisli text gives enough context to not feel out of place at the start.
|
|
||
| Func is a wrapper around a `run` function `A => F[B]` where `F` is a functor. Given that, the Func data type is equipped with the known `map` function, and a `mapK` function to apply natural transformations (from a `Func[F[_], A, B]` get an `Func[G[_], A, B]`). | ||
|
|
||
| The signature `Func[F[_], A, B]` is very similar to the signature for [Kleisli](../datatypes/kleisli.md): `Kleisli[F[_], -A, B]`. The difference is that `Func` is a less restrictive data type that wraps around functors, and only provides basic methods `run`, `map`, and `mapK`, while `Kleisli` is strong enough to provide composition, flatMap, and more. We will see a more useful data type just next with `AppFunc`. |
There was a problem hiding this comment.
Does just [Kleisli] without an explicit link not work?
There was a problem hiding this comment.
Nope, I got an exception when running the preview. I got this explicit from another doc doing the same, must be for the same reason. Idk why it says the Klesli reference is "ambiguous"
There was a problem hiding this comment.
Wierd. Too bad. Maybe 2 sections called "Kleisli" somewhere?
Hi! This pr closes issue 2650.
I tried to keep it simple, since most of the concepts are explained in the Applicative page.
I added some comments whilst I was trying to understand the code. Let me know if anything is wrong, I'm not an expert, so perhaps I got something mixed up.