scala - 如何在抽象效果类型上配置猫计时器

标签 scala functional-programming cats-effect tagless-final

假设我在使用 Cats-effect 和无标记 final方法的项目中有以下方法签名:

def schedule[F[_]: Applicative : Async: Timer]

我正在尝试使用纯 FP 在 schedule 方法调用上安排操作。

我这样试过:

Timer[F].sleep(FiniteDuration(10, TimeUnit.SECONDS)) *> {
    Applicative[F].pure(println("tick"))
}

但它没有起作用,因为 effect println("tick")Timer 初始化阶段执行。

如何让它正常工作?

我是否还可以创建某种递归构造,以便每 10 秒重复我的预定操作?

最佳答案

Applicative[F].pure 没有延迟效果。它只会将一个纯值提升到 F 中。由于您有 Async 上下文绑定(bind),我建议使用 Async[F].delay(println("tick"))

您可以像这样轻松地递归调用它:

def schedule[F[_]: Async: Timer]: F[Unit]

def repeat[F[_]: Async: Timer]: F[Unit] =
  schedule >> repeat

关于scala - 如何在抽象效果类型上配置猫计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62725929/

相关文章:

scala - Http4s 客户端/资源的集成测试

scala - 可以对组合单元测试和集成测试施加最低覆盖率吗?

Scala:只映射元组中的第一个元素

.net - 您将 f# 用于哪些代码领域?

python - toolz.thread_first() 和 toolz.thread_last() 的目的是什么?

scala - ENSIME 找不到正确的项目定义

scala - Scala 中的垂直直方图

scala - 为所有可映射类型定义提升

scala - 如何测量 Cats IO 效果中的耗时?