Полиморфный метод работает с лямбда-типом, но не с подстановочным знаком типа в Scala 3.

В Scala 3 я могу определить функтор для состояния, используя лямбда-тип:

        given stateFunctor[S]: Functor[[A] =>> State[S, A]] with
    override def map[A, B](a: State[S, A])(fx: A => B): State[S, B] = State(a.run.andThen { case (s, a) => (s, fx(a)) })

Я ожидаю, что он будет работать с?или_подстановочный знак:

        given stateFunctor[S]: Functor[State[S, ?]] with
    override def map[A, B](a: State[S, A])(fx: A => B): State[S, B] = State(a.run.andThen { case (s, a) => (s, fx(a)) })

но я получаю следующую ошибку компиляции:

Введите аргумент domain.State[S, ? <: AnyKind] не имеет того же типа, что и связанный [_$1] с данным stateFunctor[S]: Functor[State[S, ? <: AnyKind]] с

Почему это не работает? Что мне не хватает? Я думал, что Scala 3 поддерживает синтаксис типа проектора для подстановочных знаков типов.

Скала версия: 3.1.3

Если вам это нужно, вотStateиFunctorопределения:

      case class State[S, A](run:S => (S, A)):
  def exec(s:S):S = run(s)._1
  def eval(s:S):A = run(s)._2
      trait Functor[F[_]]:
  def map[A, B](a: F[A])(fx: A => B): F[B]

0 ответов

Другие вопросы по тегам