gpt4 book ai didi

scala - 如何正确使用 MonadError?

转载 作者:行者123 更新时间:2023-12-04 16:40:08 25 4
gpt4 key购买 nike

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

final class DbSystemEnvironment[F[_] : MonadError[F, Throwable]] private(env: Environment[F])
extends DbSetting[F] {
override def read(url: String, user: String, pw: String): F[DbParameter] =
(for {
a <- OptionT(env.get(url))
b <- OptionT(env.get(user))
c <- OptionT(env.get(pw))
} yield DbParameter(a, b, c))
.value
.flatMap {
case Some(v) => v.pure[F]
case None => DbSettingError.raiseError[F, DbParameter]
}

}

编译器提示:
[error] db/DbSystemEnvironment.scala:10:38: cats.MonadError[F,Throwable] does not take type parameters
[error] final class DbSystemEnvironment[F[_] : MonadError[F, Throwable]] private(env: Environment[F])
[error] ^
[error] db/DbSystemEnvironment.scala:16:9: Could not find an instance of Functor for F
[error] c <- OptionT(env.get(pw))
[error] ^
[error] db/DbSystemEnvironment.scala:20:27: value pure is not a member of Any
[error] case Some(v) => v.pure[F]
[error] ^
[error] db/DbSystemEnvironment.scala:21:37: value raiseError is not a member of object io.databaker.db.DbSettingError
[error] case None => DbSettingError.raiseError[F, DbParameter]

看来,我不使用 MonadError正确。

其余代码:
final case class DbParameter(url: String, user: String, pw: String)

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

object Environment {

def apply[F[_]](implicit ev: Environment[F]): ev.type = ev

def impl[F[_]: Sync]: Environment[F] = new Environment[F] {
override def get(v: String): F[Option[String]] =
Sync[F].delay(sys.env.get(v))
}
}

如何编译代码?

最佳答案

这里的问题是约束语法。对于具有单个参数的类型构造函数(如 Monad ),您可以编写 class Foo[F[_]: Monad] .当您需要“部分应用”具有多个参数的类型构造函数时,例如 MonadError ,情况略有不同。

如果您使用的是 kind-projector,则可以编写以下内容:

class DbSystemEnvironment[F[_]: MonadError[*[_], Throwable]]

不过,这是非标准语法,目前不包含在 Dotty 的部分 -Ykind-projector 中。兼容性支持。我建议只对隐式参数列表进行脱糖:
class DbSystemEnvironment[F[_]](implicit F: MonadError[F, Throwable]])

这完全符合您的要求,不需要额外的编译器插件,并且更加面向 future 。

关于scala - 如何正确使用 MonadError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62448156/

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