私はKittens(https://github.com/milessabin/kittens)でいくつかの実験を行い、コードをコンパイルする際に問題があります。次のエラーが表示されます。私は何の問題もなくコンパイルScalaTestでほとんど同じコードを使用していFunctorがパラメータインスタンスの暗黙の値を逃しています(sbt clean後のみ)
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))
}
}
を次のように
[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
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 の名前は次のようになります:=「型崩れ-実験」
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:誰かが私たちが子猫を使用
私のどこかにコンパイラのバグのようです。 私の最初の反応は、 'import cats.derived.functor._'の代わりにexport hookを除外しようとしています。' import cats.derived.MkFunctor._'を直接試してみてください。 – KailuoWang
1.0.0-M3(PRレビュー待ち)は、スカラー2.11.8(SI-2712修正プラグイン付き)に更新され、影響が出るかどうかは不明ですが、これがコンパイラのバグであれば... – KailuoWang
ヒントのために@ KailuoWangに感謝します。残念ながら、それは問題を解決しませんでした。 私は1.0.0-M3を待ってからSI-2712と一緒に再試行します SI-2712で発生しないコンパイラのバグを修正するのに誰も興味がないと思います。 – DaniRey