3

Kittens ( https://github.com/milesabin/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-experiments"

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 Object は基本的に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: 誰かが scala-kittens のタグを作成できるといいですね

4

1 に答える 1

0

@DaniRey プロジェクトでは子猫を使用していますが、シーケンス部分のみを使用しています。子猫の派生を使用するプロジェクトは知りません。あなたのユーザーケースは何ですか?

于 2016-05-15T20:04:00.723 に答える