Where should I put typeclass instances?

147 views Asked by At

Lets say I develop a new public data structure, lets call it FancyList. It has no external dependencies and everybody loves it.
This FancyList turns out to be a Functor, Monad, MonoidK, and Traverse.
What is the best way to provide cats instances for these type classes to my users? The way I see it I can put them:

On the same library

  • Con: Users that don't care about cats now depend on this library. Source code is also more confusing for them.
  • Pro: If I put the instances within the companion object of FancyList, implicit resolution will automatically find them, without the need for the user to import implicits explicitly (the same way no need to import cats.implicits._ for instances on NonEmptyList)

On a new library

  • Pro: No external dependencies. Big plus on simplicity.
  • Con: Users that do care about cats would 1) Have to import an extra dependency, and 2) Import the implicit evidences explicitly ( the same way you have to import cats.implicits._ for instances on structures on the standard library).

Also, what if next month users ask support for scalaz? Which of the approaches would be more appropriate?

In general, my questions are:

  • Is my pro/cons list accurate? Did I miss something?
  • What are the main arguments that I should consider?
  • What have other libraries in similar positions done? Any example you could give?
0

There are 0 answers