Функтор пропускает неявное значение для экземпляра параметра (только после очистки sbt)

Я провел несколько экспериментов с котятами ( https://github.com/milessabin/kittens) и у меня возникли проблемы с компиляцией моего кода. Я получаю следующую ошибку.

[error] ...danirey\scala\kittens\Kittens.scala:23: could not find implicit value for parameter instance: cats.Functor[danirey.scala.kittens.AdtDefns.Tree]
[error]     val funct = Functor[Tree]
[error]                        ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed

Полный файл выглядит следующим образом

package danirey.scala.kittens

/**
  * @author Dani
  */
import cats.Functor
import cats.syntax.AllSyntax
import cats.derived.functor._
import legacy._
import cats.derived.iterable.legacy._
import org.typelevel.discipline.scalatest.Discipline
import shapeless.cachedImplicit

object Kittens extends App {
  val ft = new FunctorExperiment()
  ft.print()
}

class FunctorExperiment extends AllSyntax {
  import AdtDefns._

  def print():Unit = {
    val funct = Functor[Tree]
    val tree: Tree[String] = Node(
        Leaf("Reto"),
        Node(
            Leaf("Sandra"),
            Leaf("Mike")
        )
    )

    println(funct.map(tree)(_.length))
  }
}

Я использовал практически идентичный код в ScalaTest, который компилируется без проблем.

package danirey.scala.kittens

import cats.Functor
import cats.syntax.AllSyntax
import cats.derived.functor._
import legacy._
import cats.derived.iterable.legacy._
import org.scalatest.FunSuite
import org.typelevel.discipline.scalatest.Discipline
import shapeless.cachedImplicit

/**
  * @author Dani
  */
class FunctorExperimentTest extends FunSuite with Discipline with AllSyntax {

  import AdtDefns._

  test("functors experiment") {
    val funct = Functor[Tree]

    val tree: Tree[String] = Node(
        Leaf("Reto"),
        Node(
            Leaf("Sandra"),
            Leaf("Mike")
        )
    )

    println(funct.map(tree)(_.length))
  }
}

Мой build.sbt выглядит следующим образом name:= "shapeless-эксперименты"

version := "1.0-SNAPSHOT"

scalaVersion := "2.11.8"

exportJars := true

libraryDependencies ++= Seq(
  "com.chuusai" % "shapeless_2.11" % "2.3.0",
  "org.typelevel" % "kittens_2.11" % "1.0.0-M2",
  "org.scalatest"   %% "scalatest"      % "3.0.0-M7" % "test"
)

scalacOptions ++= Seq(
  "-feature",
  "-language:higherKinds",
  "-language:implicitConversions",
  "-unchecked"
)

Самое интересное, что он компилируется как часть инкрементной компиляции.

Если я закомментирую строки с номерами 16, 23 и 32, затем выполню "sbt compile", затем снова удалю комментарии и выполню "sbt compile/package", который он компилирует, и я даже могу выполнить программу. Но как только я запускаю "sbt clean", он больше не будет компилироваться.

Объект AdtDefns в основном является копией https://github.com/milessabin/kittens/blob/master/core/src/test/scala/cats/derived/adtdefns.scala. Соответствующая часть

object AdtDefns {
  sealed trait Tree[T]
  final case class Leaf[T](t: T) extends Tree[T]
  final case class Node[T](l: Tree[T], r: Tree[T]) extends Tree[T]
}

PS: было бы неплохо, если бы кто-то мог создать тег для котят-скала

1 ответ

@DaniRey мы используем котят в наших проектах, но только часть последовательности. Я не знаю ни одного проекта, который использует вывод котят. Каков твой пользовательский случай?

Другие вопросы по тегам