I just tried to compile the following code:
import cats.Monoid
import cats.instances.boolean._ // for Monoid
import cats.instances.int._ // for Monoid
import cats.instances.list._ // for Monoid
import cats.instances.string._ // for Monoid
import cats.syntax.apply._ // for imapN
import cats.syntax.semigroup._
case class Cat2(name: String, yearOfBirth: Int, favoriteFoods: List[String])
object FancyFunctor {
val tupleToCat: (String, Int, List[String]) => Cat2 =
Cat2.apply _
val catToTuple: Cat2 => (String, Int, List[String]) =
cat => (cat.name, cat.yearOfBirth, cat.favoriteFoods)
implicit val catMonoid: Monoid[Cat2] = (
Monoid[String],
Monoid[Int],
Monoid[List[String]]
).imapN(tupleToCat)(catToTuple)
def main(args: Array[String]): Unit = {
val garfield = Cat2("Garfield", 1978, List("Lasagne"))
val heathcliff = Cat2("Heathcliff", 1988, List("Junk Food"))
val a = garfield |+| heathcliff
}
}
And I've got the error message:
[info] Compiling 1 Scala source to /home/developer/Desktop/scala/catssemigroupal/target/scala-2.12/classes ...
[error] /home/developer/Desktop/scala/catssemigroupal/src/main/scala/io/khinkali/FancyFunctor.scala:25:22: could not find implicit value for parameter semigroupal: cats.Semigroupal[cats.kernel.Monoid]
[error] ).imapN(tupleToCat)(catToTuple)
[error] ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 1 s, completed Feb 24, 2018, 10:18:01 PM
What am I doing wrong?