如何在抽象效果类型上配置猫计时器
How to configure Cats Timer on abstract effect type
假设我在使用 Cats-effect
和无标记最终方法的项目中有以下方法签名:
def schedule[F[_]: Applicative : Async: Timer]
我正在尝试使用纯 FP 在 schedule
方法调用上安排操作。
我这样试过:
Timer[F].sleep(FiniteDuration(10, TimeUnit.SECONDS)) *> {
Applicative[F].pure(println("tick"))
}
但没有成功,因为效果 println("tick")
在 Timer
初始化阶段执行。
如何让它正常工作?
我还可以创建某种递归构造以便每 10 秒重复我的计划操作吗?
Applicative[F].pure
不延迟效果。它只会将一个纯值提升为 F
。由于您有 Async
上下文绑定,我建议 Async[F].delay(println("tick"))
.
您可以像这样轻松地递归调用它:
def schedule[F[_]: Async: Timer]: F[Unit]
def repeat[F[_]: Async: Timer]: F[Unit] =
schedule >> repeat
只是用上面的写了一个完整的例子。感谢他们。
package com.example.timerapp
import cats.Applicative
import cats.effect.{Async, ExitCode, IO, IOApp, Timer}
import cats.syntax.apply._
import cats.syntax.flatMap._
import scala.concurrent.duration._
import java.time.Instant
object TimerApp extends IOApp {
override def run(args: List[String]): IO[ExitCode] = {
repeat[IO].as(ExitCode.Success)
}
def schedule[F[_]: Applicative: Async: Timer]: F[Unit] =
Timer[F].sleep(1 second) *> {
Async[F].delay(println(Instant.now.toString))
}
def repeat[F[_]: Async: Timer]: F[Unit] =
schedule[F] >> repeat
}
假设我在使用 Cats-effect
和无标记最终方法的项目中有以下方法签名:
def schedule[F[_]: Applicative : Async: Timer]
我正在尝试使用纯 FP 在 schedule
方法调用上安排操作。
我这样试过:
Timer[F].sleep(FiniteDuration(10, TimeUnit.SECONDS)) *> {
Applicative[F].pure(println("tick"))
}
但没有成功,因为效果 println("tick")
在 Timer
初始化阶段执行。
如何让它正常工作?
我还可以创建某种递归构造以便每 10 秒重复我的计划操作吗?
Applicative[F].pure
不延迟效果。它只会将一个纯值提升为 F
。由于您有 Async
上下文绑定,我建议 Async[F].delay(println("tick"))
.
您可以像这样轻松地递归调用它:
def schedule[F[_]: Async: Timer]: F[Unit]
def repeat[F[_]: Async: Timer]: F[Unit] =
schedule >> repeat
只是用上面的写了一个完整的例子。感谢他们。
package com.example.timerapp
import cats.Applicative
import cats.effect.{Async, ExitCode, IO, IOApp, Timer}
import cats.syntax.apply._
import cats.syntax.flatMap._
import scala.concurrent.duration._
import java.time.Instant
object TimerApp extends IOApp {
override def run(args: List[String]): IO[ExitCode] = {
repeat[IO].as(ExitCode.Success)
}
def schedule[F[_]: Applicative: Async: Timer]: F[Unit] =
Timer[F].sleep(1 second) *> {
Async[F].delay(println(Instant.now.toString))
}
def repeat[F[_]: Async: Timer]: F[Unit] =
schedule[F] >> repeat
}