The current state of the Cats project, as I understand it

Since Erik Osheim's creating of the cats github repository last week there has been a lot of buzz around the cats project. Many of us were anticipating such a thing to come for some time now. Although I expected that this project would get a lot of quick momentum, the amount of attention the project has gotten so quickly, and the contributors that have already flocked to the project have been remarkable.

What is the Cats project?

Like scalaz, it intends to be a library that provides abstractions which aid in programming with functions in scala.

Why was the Cats project started?

I'm not going to make the mistake of trying to summarize all the events that led up to this. Instead what I'll say is that it became clear that there were fundamental disagreements about how the scalaz project should be structured and run. Because these disagreements were so severe, it was clear to many that there should be separate projects.

The Cats project will differ from the scalaz project in some fundamental ways. Cats will have a strong focus on approachability. We want to focus on making sure there is a smoother onboarding for new users, and for new contributors. There is going to be a big focus on documentation, both in the form of in-line comments in the source, and also external documentation. There will be a strong focus on the approachability of the community newcomers. We are operating under the Typelevel Code of Conduct, and beyond that, we are trying to craft language in our README file which states clearly that we want to be proactive about trying to ensure that people trying in some way to participate in or use this project don't feel harmed in any way by others involved in this project. If people experiencing any kind of pain from the project we want to quickly get to the bottom of the cause, if that is a misunderstanding or miscommunication, or some bad actor.

Is this a fork of scalaz?

No, this library is being written from the ground up. It will share many of the same abstractions as scalaz. The project will be organized differently, it will be more modular; typeclass definitions will be in a different module than data structures, which will be in a different module than typeclass instances. Some of the typeclasses in Cats have different names than their counterparts in scalaz. Many of the typeclasses and data types that exist in scalaz will not have counterparts in cats.

This is an exciting opportunity to rethink some of the decisions that were made in scalaz, we have no users now, we are able to make breaking changes rapidly in order to experiment. I think this is going be something important in making the experience using this library more painless.

Is Cats a typelevel project?

Not currently. It might be put under the typelevel umbrella sometime in the future. Currently the canonical location for the cats library is Erik's github account. As we move towards an actual release, this is almost certainly going to move to some other location. This might be a move to typelevel, perhaps that is even likely, but its an open question now.

So is everything awesome?

No, certainly not. Many are sad that it got to this point. A lot of feelings have been hurt, sometimes unnecessarily, sometimes irreparably. Many other people are feeling discomfort because they don't want to participate in the discussions that have caused this rift in the scala functional programming community at all, but now feel like they are making an implicit statement in lieu of an explicit statement just by choosing which library they use, or which libraries their public projects depend on.

What about scalaz-streams, scalaz-concurrent?

There are many people which are already contributing to Cats asking this question. It seems like there is a lot of interest in these, but it is also clear that these libraries are very tricky, very nuanced, and nowhere near as easy to get done right as cats-core will be. Many of us, myself included, are very much tied to scalaz.concurrent.Task and scalaz.stream.Process, and this is going to keep us on scalaz for months or years to come. I think that there will be some form of Task, and some form of Process that will eventually exist using cats. Its unclear now when that might happen, who might be leading the effort, or if there is some hope of making the right shared abstractions that it might be possible for these libraries to be shared between Cats and scalaz.

How can I help?

As it is such a new library, which is hoping to accomplish so much, there is tons of work to be done. In order to acheive our goals of this library being one which is easily approachable, there is much documentation to be written. We are currently working on putting together a contributor guide. But the canonical answer to "how can I help" is going to be to look at the issues on GitHub and see if there are some you can solve. We are additionally trying to tag bugs good for people new to the library with the "low-hanging fruit" tag. You should feel free to grab any bugs in the "Ready" column here