0

タグなしの最終的なアプローチを使用するコードがいくつかあり、Intellij IDEA が暗黙的なクラスからメソッドを認識できないことがわかりました。

ここにはいくつかの型クラス ( Functor、など) がありApply、. このコードはコンパイルされますが、IDEA が見つからず、. エラーを見てください:Applicativeimplicit class FunctorOpsFunctorvoidimplicit 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 Code with Metalsなどを使用する方がよいですか? tagless final でうまく機能するものはありますか?

私は std lib を使用し、Fドット メソッド構文を使用するために sbt にコンパイラ プラグインを追加します。

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

scastie のビルド パラメータを使用したコード

スクリーンショット:

ここに画像の説明を入力

ここに画像の説明を入力

私の環境:

  • Intellij IDEAバージョン2020.2.3 (最後の安定したscala プラグインを使用)

  • OS: macOS カタリナ10.15.7

4

1 に答える 1