【问题标题】:Kind compiler plugin λ not found种类编译器插件 λ 未找到
【发布时间】:2018-07-23 20:34:31
【问题描述】:

我启用了 kind 编译器插件 addCompilerPlugin("org.spire-math" % "kind-projector" % "0.9.6"),现在我可以使用 ? 符号,例如Map[String, ?] 但是 Lambda 和 λ 未解析。

val f: Id ~> Future = λ[Id ~> Future](...)

产生Error: not found: value λ。 kind 编译器还支持 λ 吗?

【问题讨论】:

  • 你是用 sbt 还是某种编辑器(比如 IntelliJ)编译?例如。 IntelliJ 编写了他们自己的 scala 解析器,可能会给你错误的标志。
  • 我在 intellij 和普通 sbt:compile 中遇到同样的错误

标签: scala type-kinds kind-projector


【解决方案1】:

首先,提醒一下应该添加

addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.6")

发给build.sbt,而不是plugins.sbt

然后,例如,对于

import scala.language.higherKinds

trait MyTrait[F[_]]

lambda 类型声明

class MyClass extends MyTrait[({ type l[A] = Map[String, A] })#l]

可以替换为

class MyClass extends MyTrait[Map[String, ?]]

class MyClass extends MyTrait[λ[A => Map[String, A]]]

class MyClass extends MyTrait[Lambda[A => Map[String, A]]]

我不确定

val f: Id ~> Future = λ[Id ~> Future](???)

是一个有效的语法。

~> 通常用于像

中的自然变换
import cats.{Id, ~>}
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

val f: Id ~> Future = new (Id ~> Future) {
  override def apply[A](fa: A): Future[A] = Future(fa)
}

不适用于 lambdas 类型。

更新。好的,是多态 lambda https://github.com/typelevel/kind-projector#polymorphic-lambda-values

【讨论】:

    【解决方案2】:

    我刚刚通过快速rm -rf ./target 并重新启动一切解决了这个确切的问题(感觉不是第一次)。

    我还删除了我的 ensime 项目缓存,只是为了确保 - 对 IntelliJ 做同样的事情大概也是一个好主意。

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 2021-04-10
      • 2014-04-28
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      相关资源
      最近更新 更多