【问题标题】:Intellij IDEA cannot resolve symbol on implicits (scala tagless final)Intellij IDEA 无法解析隐含符号(scala tagless final)
【发布时间】:2020-11-15 09:56:47
【问题描述】:

我有一些使用 tagless final 方法的代码,发现 Intellij IDEA 无法识别隐式类中的方法。

我这里有一些类型类(FunctorApplyApplicative 等)和一个 implicit class FunctorOps 以及一些用于 Functor 的辅助方法。此代码编译但 IDEA 找不到 voidimplicit Applicative。查看错误:

无法解析符号 void:44

无隐式参数类型:Applicative[F_]:51

代码看起来不太难:

trait Functor[F[_]] {
  def map[A, B](fa: F[A])(ab: A => B): F[B]
}

trait Semigroupal[F[_]] {
  def product[A, B](fa: F[A], fb: F[B]): F[(A, B)]
}

trait Apply[F[_]] extends Semigroupal[F] with Functor[F] {
  def map2[A, B, Result](fa: F[A], fb: F[B])(abr: (A, B) => Result): F[Result] =
    map(product(fa, fb))(abr.tupled)
}

trait Applicative[F[_]] extends Apply[F] {
  def pure[A](a: A): F[A]
}

object Implicits {

  final implicit class FunctorOps[F[_]: Functor, A](private val fa: F[A]) {
    @inline def map[B](ab: A => B): F[B] =
      F.map(fa)(ab)

    @inline def void: F[Unit] =
      F.map(fa)(_ => ())
  }
}

trait Random[F[_]] {
  def nextInt(n: Int): F[Int]

  def void: F[Unit]
}

object Random {
  import Implicits.FunctorOps

  def dsl[F[_]: Applicative]: Random[F] =
    new Random[F] {
      override def nextInt(n: Int): F[Int] = F.pure(scala.util.Random.nextInt(n))

      override def void: F[Unit] = nextInt(4).void
    }
}

object Foo {

  def dsl[F[_]: Applicative]: F[Unit] =
    Random.dsl.void
}

我的问题: 有什么方法可以避免 IDEA 中出现此错误,或者最好将 VS CodeMetals 一起使用或别的东西? tagless final 是否有更好的效果?

我使用 std lib 并在 sbt 中添加编译器插件以使用 F 点方法语法:

addCompilerPlugin("org.augustjune" %% "context-applied" % "0.1.4")

Code with build parameters in scastie

截图:

我的环境:

  • Intellij IDEA 版本 2020.2.3(带有最后一个稳定的 scala 插件

  • 操作系统:MacOS Catalina 10.15.7

【问题讨论】:

  • 我只会将 metals 与您喜欢的任何编辑器一起使用。 InteliJ 以错误的编译错误而闻名,代码越是“高级”或复杂,它就越容易失败。
  • 无法重现:monosnap.com/file/2msi8gcCEl8DF4kdVgfdwrwjJSTxyx 尝试文件 |使缓存无效/重新启动.. |无效并重新启动。如果问题仍然存在,请在youtrack.jetbrains.com/issues/SCL 报告一个最小的示例项目。谢谢。
  • @Andrey 从您的屏幕截图中我得知您使用的是 Intellij IDEA EAP(早期访问)版本,但我使用的是最后一个稳定版本(更新的问题)。我下载了这个IDEA版本,这些错误的错误消失了。谢谢你的尝试。我希望 IDEA 在未来的稳定版本中保持正确的行为。

标签: scala intellij-idea ide implicit tagless-final


【解决方案1】:

此行为已在下一个稳定的 Intellij IDEA 版本 2020.2.4 中修复,并且可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多