Функтор пропускает неявное значение для экземпляра параметра (только после очистки 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-sessions"

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/dehibited/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: Было бы неплохо, если бы кто-нибудь мог создать тег для scala-котят


person DaniRey    schedule 01.05.2016    source источник
comment
Мне кажется, что это где-то ошибка компилятора. Моя первая реакция была бы попытаться исключить ловушку экспорта, вместо import cats.derived.functor._, попробуйте import cats.derived.MkFunctor._ напрямую.   -  person KailuoWang    schedule 04.05.2016
comment
также 1.0.0-M3 (ожидающий рассмотрения PR) будет обновлен до scala 2.11.8 (с плагином исправления SI-2712), не уверен, что это повлияет, но если это ошибка компилятора ...   -  person KailuoWang    schedule 04.05.2016
comment
Спасибо @KailuoWang за подсказку. К сожалению, это не решило проблему. Я подожду 1.0.0-M3, а затем попробую еще раз вместе с SI-2712. Думаю, никому не будет интересно исправлять ошибку компилятора в этой области, если она все равно не возникнет с SI-2712.   -  person DaniRey    schedule 04.05.2016
comment
Чтобы быть ясным, я не уверен, связано ли это с SI-2712. Если есть какие-то отличия от версии 1.0.0-M3 в этой проблеме, то, скорее всего, это будет обновление до 2.11.8.   -  person KailuoWang    schedule 04.05.2016
comment
Спасибо за разъяснения. Еще раз протестирую, как только выйдет 1.0.0-M3.   -  person DaniRey    schedule 04.05.2016
comment
FYI 1.0.0-M3 отсутствует.   -  person KailuoWang    schedule 05.05.2016
comment
@KailuoWang Спасибо. К сожалению, обновление до 1.0.0-M3 не решило проблему. У вас есть идеи, как дальше анализировать этот вопрос.   -  person DaniRey    schedule 07.05.2016
comment
У меня нет идей (и их не так много для начала).   -  person KailuoWang    schedule 10.05.2016
comment
@KailuoWang У меня до сих пор такое чувство, что я совершил основную ошибку или неправильно понял котят, что и привело к этой ошибке. Не могли бы вы дать мне указатель на простой проект с открытым исходным кодом, который использует котят как часть своей реализации. Может быть, я найду свою ошибку, посмотрев на код других людей.   -  person DaniRey    schedule 14.05.2016


Ответы (1)


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

person KailuoWang    schedule 15.05.2016
comment
У меня пока нет конкретного варианта использования. Мне просто не терпится узнать и понять новые концепции. - person DaniRey; 17.05.2016
comment
@DaniRey Я думал, что у него может быть что-то сегодня с delayedInit в App, хотя я не уверен. Если вы хотите использовать это в своем реальном коде, я бы сказал, что можно было бы добавить неявный производный экземпляр в сопутствующий объект. - person KailuoWang; 19.05.2016
comment
Извините за задержку с ответом. Я просто изменил код, чтобы использовать класс с функцией main вместо расширения App, к сожалению, это ничего не изменило. Что касается неявного производного экземпляра. Мне очень жаль, но я не знаю, что делать. Вы предлагаете создать объект-компаньон для FunctorExperiment? Но затем добавить неявный производный экземпляр чего? - person DaniRey; 23.05.2016
comment
Я предлагал добавить объект-компаньон для Tree и добавить что-то вроде «` `implicit val f: Functor [Tree] = cats.dehibited.MkFunctor [Tree]« ``, и в ваших тестах вам не нужно импортировать кошек. больше не выводится. - person KailuoWang; 23.05.2016
comment
Большое спасибо за ваше терпение. Я попытался изменить код, как вы предложили, но теперь я получаю следующую ошибку компиляции could not find implicit value for parameter mff: cats.derived.MkFunctor[danirey.scala.kittens.AdtDef ns.Tree] Я добавил следующий объект-компаньон для Tree в adtdefns object Tree { implicit val f: Functor[Tree] = cats.derived.MkFunctor[Tree] } И упростил свой объект Kittens. Код доступен по адресу github.com/DaniRey/shapeless-experiments. - person DaniRey; 26.05.2016