これはおそらく以前に何度も尋ねられたことがありますが、私が見つけた提案はどれも役に立ちませんでした.
いくつかの副作用に依存する長い数値を生成する単純な Scala コードがあります。私は IO モナドでラップしていますが、最小電力の原則に従って、実際には自分の関数を として宣言していますF[_]: Effect
。コードがコンパイルされず、その理由がわかりません。何が間違っているのか教えてください
import cats.effect.{Clock, Effect}
import cats.syntax.all._
import java.util.concurrent.TimeUnit
...
def generateId[F[_]: Effect](rid: Long)(implicit F: Effect[F], clock: Clock[F]): F[Long] =
for {
currentTimeNanos <- clock.realTime(TimeUnit.NANOSECONDS)
tid <- F.delay(Thread.currentThread().getId)
} yield
(tid << 40 /* */ & 0xFFFFFF0000000000L) |
(rid << 16 /* */ & 0x000000FFFFFF0000L) |
(currentTimeNanos & 0x000000000000FFFFL)
[error] /.../package.scala:34:41: value flatMap is not a member of type parameter F[Long]
[error] currentTimeNanos <- clock.realTime(TimeUnit.NANOSECONDS)
[error] ^
[error] /.../package.scala:35:34: value map is not a member of type parameter F[Long]
[error] tid <- F.delay(Thread.currentThread().getId)
また、コードを改善するための提案があれば、お知らせください。