簡體   English   中英

Intellij IDEA 無法解析隱式符號(scala 無標記最終)

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

我有一些使用無標記最終方法的代碼,發現 Intellij IDEA 無法識別來自隱式 class 的方法。

我這里有一些類型類( FunctorApplyApplicative等)和一個implicit class FunctorOps以及Functor的一些輔助方法。 此代碼編譯但 IDEA 無法找到voidimplicit Applicative 查看錯誤:

無法解析符號 void:44

沒有類型的隱式 arguments: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 with Metals或其他東西? 有沒有什么東西可以更好地與無標簽決賽一起使用?

我使用標准庫並在 sbt 中添加編譯器插件以使用F點方法語法:

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

scastie 中帶有構建參數的代碼

截圖:

在此處輸入圖像描述

在此處輸入圖像描述

我的環境:

  • Intellij IDEA版本2020.2.3 (帶有最后一個穩定的 scala 插件

  • 操作系統:MacOS Catalina 10.15.7

此行為已在下一個穩定的Intellij IDEA版本2020.2.4中修復並正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM