Scala 使用cats效应'实现可取消的设置间隔;s定时器

Scala 使用cats效应'实现可取消的设置间隔;s定时器,scala,scala-cats,cats-effect,Scala,Scala Cats,Cats Effect,这是我尝试过的,但在第一次睡眠结束后它是不可取消的 import cats.syntax.all._ import cats.effect._ import scala.concurrent.duration._ import scala.language.higherKinds object Foo { def setInterval[F[_]](duration: FiniteDuration)( fa: F[Unit] )(implicit F: ConcurrentEf

这是我尝试过的,但在第一次睡眠结束后它是不可取消的

import cats.syntax.all._
import cats.effect._
import scala.concurrent.duration._
import scala.language.higherKinds

object Foo {
  def setInterval[F[_]](duration: FiniteDuration)(
    fa: F[Unit]
  )(implicit F: ConcurrentEffect[F], T: Timer[F]): F[IO[Unit]] = {
    def run: F[Unit] = {
      T.sleep(duration) *>
        F.liftIO(F.runAsync(F.suspend(run))(_ => IO.unit)) *> fa
    }
    F.liftIO(F.runCancelable(run)(_ => IO.unit))
  }
}
如何实现真正可取消的
setInterval

在的帮助下,我认识到

F.liftIO(F.runAsync(F.suspend(run))(_ => IO.unit)) *> fa
runAsync
只需使下一个递归调用在后台运行并且不可取消,因此我必须在后台执行
fa
,就像这样

F.liftIO(F.runAsync(fa)(_ => IO.unit)) *> F.suspend(run)