gpt4 book ai didi

scala - 选项[io.databaker.env.EnvValue],但类型F在类型上是不变的

转载 作者:行者123 更新时间:2023-12-04 02:34:27 26 4
gpt4 key购买 nike

我有以下代码片段,它没有被编译:

trait Environment[F[_]] {
def get(v: EnvVariable): F[Option[EnvValue]]
}

final class LiveBadEnvironment[F[_] : Sync] extends Environment[F] {
override def get(v: env.EnvVariable): F[Option[env.EnvValue]] = None.pure[F]
}

编译器提示:

[error]  found   : F[None.type]
[error] required: F[Option[io.databaker.env.EnvValue]]
[error] (which expands to) F[Option[io.databaker.env.EnvValue.Type]]
[error] Note: None.type <: Option[io.databaker.env.EnvValue], but type F is invariant in type _.
[error] You may wish to define _ as +_ instead. (SLS 4.5)
[error] override def get(v: env.EnvVariable): F[Option[env.EnvValue]] = None.pure[F]

我做错了什么?

最佳答案

这是问题的最小化示例,显示了引入 pure 扩展方法的导入:

scala> import cats.Applicative, cats.implicits._
import cats.Applicative
import cats.implicits._

scala> def foo[F[_]: Applicative]: F[Option[String]] = None.pure[F]
^
error: type mismatch;
found : F[None.type]
required: F[Option[String]]
Note: None.type <: Option[String], but type F is invariant in type _.
You may wish to define _ as +_ instead. (SLS 4.5)

问题是 None.pure[F] 的类型被推断为 F[None.type],而预期的返回类型不会影响推断。如果您对上下文绑定(bind)和扩展方法进行脱糖,类型推断将按您预期的方式工作:

scala> def foo[F[_]](implicit F: Applicative[F]): F[Option[String]] = F.pure(None)
def foo[F[_]](implicit F: cats.Applicative[F]): F[Option[String]]

你也可以写出类似 Option.empty[String].pure[F] 等的东西——有很多方法会遇到这种问题(过于精确的类型推理),以及许多解决它的方法,您应该选择哪种主要取决于品味。

关于scala - 选项[io.databaker.env.EnvValue],但类型F在类型上是不变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62495683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com