Функтор пропускает неявное значение для экземпляра параметра (только после очистки 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 мы используем котят в наших проектах, но только часть последовательности. Я не знаю ни одного проекта, который использует вывод котят. Каков твой пользовательский случай?