Полиморфный метод работает с лямбда-типом, но не с подстановочным знаком типа в 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]