Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 最后的第一个无标记方法_Scala_Scala Cats_Tagless Final - Fatal编程技术网

Scala 最后的第一个无标记方法

Scala 最后的第一个无标记方法,scala,scala-cats,tagless-final,Scala,Scala Cats,Tagless Final,我正在尝试使用Scala中的第一次无标记最终模式,并且有点挣扎 我有以下代数定义: trait DbSetting[F[_]] { def read(url: String, user: String, pw: String): F[DbParameter] } trait Environment[F[_]] { def get(v: String) : F[Option[String]] } 口译员执行: final case class DbParameter(url: Stri

我正在尝试使用Scala中的第一次无标记最终模式,并且有点挣扎

我有以下代数定义:

trait DbSetting[F[_]] {
  def read(url: String, user: String, pw: String): F[DbParameter]
}

trait Environment[F[_]] {
  def get(v: String) : F[Option[String]]
}
口译员执行:

final case class DbParameter(url: String, user: String, pw: String)

sealed trait DbError extends NoStackTrace
case object DbSettingError extends DbError


sealed trait DbError extends NoStackTrace
case object DbSettingError extends DbError


// Environment implementation
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))
  }
}

// DbSetting implementation
class DbSystemEnvironment[F[_] : MonadError[*, Throwable]] private(env: Environment[F])
  extends DbSetting[F] {
  override def read(url: String, user: String, pw: String): F[DbParameter] = env.get(url)

}

我想做的是,将
环境
组合到
DbSystemEnvironment
中。这里的问题是,我无法从
env.get(url)
中获取值,因为我对
DbSystemEnvironment
中的
F
一无所知,只知道它是
MonadError
。 如何从
env.get(url)中获取值::F[选项[字符串]


此外,如果
env.get(url)
read
函数中返回
Nothing
,那么它应该返回
MonadError
,如果我正确理解了您的问题,您会问如何从调用
env.get(url)
中提取返回值,然后将其映射到
F[DbParameter]

由于您的
F[\u]
具有
MonadError
,您应该能够通过执行以下操作非常容易地映射结果:

import cats.syntax.flatMap._
import cats.syntax.applicative._
import cats.syntax.applicativeError._

override def read(url: String, user: String, pw: String): F[DbParameter] = 
  env.get(url).flatMap {
    case Some(ev) => DbParameter(ev, user, pw).pure[F]
    case None     => (new Exception("No environment parameter found!")).raiseError[F, DbParameter]
  }

为什么您指的是“获取
env.get(url)
的值”?你想
.map
它,
处理
错误还是其他什么?因为对于您为
F
(Sync/MonadError)定义的代数,您可以提升值、映射/flatMap it handle、mapN等,但不能将F[A]转换为A(这需要Comonad)。相切,但我会将ZIO()视为无标记final的替代方法。我个人觉得这更容易处理。