Вот пример, который отлично работает:
import cats.data.ReaderT
import cats.instances.option._
...
def f1:ReaderT[Option, Service, Int] =
ReaderT(service => for {
res <- Some(10)
} yield res )
Вот пример, который не скомпилирован:
def f2:ReaderT[Option, Service, Int] =
for {
res <- ReaderT((_:Service) => Some(10))
} yield res
Я получаю следующую ошибку:
Ошибка: (53, 11) не удалось найти неявное значение для параметра F: cats.Functor [Some] res <- ReaderT ((<em>: Service) => Some (10)) Ошибка: (53, 11) недостаточно аргументов для отображения метода: (неявный F: cats.Functor [Some]) cats.data.Kleisli [Some, com.savdev.Service, Int].Неуказанное значение параметра F. res <- ReaderT ((</em>: Service) => Some (10))
Чтобы исправить ошибку во 2-м примере, я должен вернуть не Some
,но Option
, который является родителем для Some
:
def f2:ReaderT[Option, Service, Int] =
for {
res <- ReaderT((_:Service) => Option(10))
} yield res
Не могли бы вы объяснить это?Почему в первом примере возвращение Some
, а не Option
, работает нормально.Почему при этом во 2-м примере возвращение Some
не компилируется?Есть ли возможность компиляции случаев компилятором Scala, как во втором примере?Или другое решение.