Я использую Scala 2.13 и разрабатываю собственную монаду Reader
. Реализация монады заключается в следующем.
object ReaderMonad {
implicit def reader[From, To](f: From => To): Reader[From, To] = Reader(f)
case class Reader[From, To](f: From => To) {
def run(input: From): To =
f(input)
def map[NewTo](transformation: To => NewTo): Reader[From, NewTo] =
Reader(c => transformation(f(c)))
def flatMap[NewTo](transformation: To => Reader[From, NewTo]): Reader[From, NewTo] =
Reader(c => transformation(f(c)).run(c))
}
def pure[From, To](a: To): Reader[From, To] = Reader((c: From) => a)
}
Используя такую монаду, я определяю хранилище для акций.
trait StockRepository {
def findAll: Map[String, Double]
}
Stocks
Сервис использует реализацию хранилища. используя монаду Reader
для внедрения зависимости репо.
object Stocks {
def findAll: Reader[StockRepository, Map[String, Double]] =
(repo: StockRepository) => repo.findAll()
}
Мой вопрос: почему я должен явно указывать тип параметра repo
в последнем определении функции, (repo: StockRepository) => repo.findAll()
? Почему компилятор Scala не может выводить тип неявно для меня?
Большое спасибо.