Я переопределил def get(v: env.EnvVariable): F[Option[env.EnvValue]] = F.pure(None)
и получил сообщение об ошибке not found: value F
. Что я делаю не так?
Подумайте, как имя F
используется в implicit F: Applicative[F]
def foo[F[_]](implicit F: Applicative[F]): F[Option[String]] = F.pure(None)
| | | |
type value type "type as value"
Обратите внимание, как значение параметр F
имеет то же имя , что и параметр type F
. Теперь вызов метода для значения F
выглядит так, как будто мы вызываем метод для типа
F.pure(None)
Вызов метода для типа с использованием точечного синтаксиса невозможен в Scala, но концептуально это это то, что мы делаем - мы будем sh, чтобы передать идею вызова функции "уровня типа". Это соглашение об именах работает, потому что значения и типы находятся в двух разных юниверсах, поэтому мы можем повторно использовать одно и то же имя без конфликтов. Например, подумайте, почему следующее является допустимым:
scala> object f { def f[f](f: f): f = f }
| val Int: Int = 42
object f
val Int: Int = 42
Теперь при использовании привязки контекста :
нотации
def foo[F[_]: Applicative]: F[Option[String]] = Applicative[F].pure(None)
у нас нет имени неявного параметр value для работы, поэтому мы не можем использовать вышеуказанный трюк с соглашением и вызывать
F.pure(None)
, потому что, опять же, точечная нотация в типах строго говоря недопустима, поэтому вместо этого мы используем сопутствующий объект с уловкой основного метода
Applicative[F].pure(None)
Это работает, потому что Applicative
companion имеет что-то вроде
Applicative {
def apply[F[_]](implicit instance: Applicative[F]): Applicative[F] = instance
}
, поэтому вызов
Applicative.apply[F]
или короче
Applicative[F]
возвращает неявное instance
в объеме. На данный момент у нас есть значение , с которым мы можем работать, и поэтому точечная нотация становится допустимой
Applicative[F].pure(None)
|
ok because invoked on a value
Следовательно, вы должны вызывать Sync[F].pure(None)
вместо F.pure(None)
, потому что в в вашем конкретном случае вы используете границы контекста.