首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何缩小ZIO调度环境?

如何缩小ZIO调度环境?
EN

Stack Overflow用户
提问于 2020-11-30 20:32:54
回答 1查看 263关注 0票数 2

有一个简单API的例子,它使用ZIO效果返回NoneOption[String]。我使用ZIO调度来运行效果,只要返回None,但限制在一定次数内。该示例基于来自排程的代码

代码语言:javascript
复制
import zio._
import zio.random._
import zio.duration._
import zio.console.{Console, putStrLn}
import zio.Schedule

import scala.util.{Random => ScalaUtilRandom}

object RecordAPI {

  def randomId(length: Int): String =
    LazyList.continually(ScalaUtilRandom.nextPrintableChar).filter(_.isLetterOrDigit).take(length).mkString

  def getRecordId: Task[Option[String]] = Task.effect(
    if (ScalaUtilRandom.nextInt(10) >= 7) Some(randomId(16)) else None
  )
}

object ScheduleUtil {

  def schedule[A]: Schedule[Random, Option[String], Option[String]] =
    (Schedule.exponential(10.milliseconds) && Schedule.recurs(10)) *> Schedule.recurWhile(_.isEmpty)
}

object RandomScheduler extends scala.App {
  implicit val rt: Runtime[zio.ZEnv] = Runtime.default

  rt.unsafeRun {
    RecordAPI.getRecordId
      .repeat(ScheduleUtil.schedule)
      .foldM(
        ex => putStrLn(s"failed with ${ex.getMessage}"),
        success => putStrLn(s"Succeeded with $success")
      )
  }
}

下面这个效果的类型是ZIO[Random with clock.Clock, Throwable, Option[String]]

代码语言:javascript
复制
RecordAPI.getRecordId.repeat(ScheduleUtil.schedule)

我想通过提供ScheduleUtil.schedule env来消除Random上的Random依赖,并接收效果ZIO[Any with clock.Clock, Throwable, Option[String]]

代码语言:javascript
复制
RecordAPI.getRecordId.repeat(ScheduleUtil.schedule.provide(Random))

但是我得到了编译错误:

代码语言:javascript
复制
[error]  found   : zio.random.Random.type
[error]  required: zio.random.Random
[error]     (which expands to)  zio.Has[zio.random.Random.Service]
[error]       .repeat(ScheduleUtil.schedule.provide(Random))
[error]                                             ^
[error] one error found

应该向.provide方法提供哪些参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-01 08:41:27

错误消息告诉您,您试图传递到行中的函数provide Random.type

代码语言:javascript
复制
RecordAPI.getRecordId.repeat(ScheduleUtil.schedule.provide(Random))

Random作为类型传递,但provide需要Random实例。因此,只需将Random类型替换为它的实例,就可以使代码可编译:

代码语言:javascript
复制
val hasRandomService: Random = Has.apply(Random.Service.live)
val randomIdZIO: ZIO[Random, Throwable, Option[String]] = 
  RecordAPI.getRecordId.repeat(ScheduleUtil.schedule.provide(hasRandomService))

但是,如果您想摆脱ScheduleUtil.schedule,最好使用Schedule.fromFunction函数:

代码语言:javascript
复制
val randomIdZIOFromFunction: ZIO[Random, Throwable, Option[String]] = 
  RecordAPI.getRecordId.repeat(
    Schedule.fromFunction(_ => if (ScalaUtilRandom.nextInt(10) >= 7) Some(randomId(16)) else None)
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65080762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档