Intellij IDEA 无法解析隐式符号(scala 无标记最终)

Intellij IDEA cannot resolve symbol on implicits (scala tagless final)

我有一些代码使用 无标记最终 方法,发现 Intellij IDEA 无法从隐式 class.

识别方法

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

Cannot resolve symbol void:44

No implicit arguments of type: 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 Code金属 还是别的? tagless final 是否有更好的效果?

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

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

Code with build parameters in scastie

截图:

我的环境:

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