使用 cats.effect 时,值 flatMap 不是类型参数 F[Long] 的成员
value flatMap is not a member of type parameter F[Long] when using cats.effect
这个问题以前可能被问过很多次,但是 none 的建议对我有帮助。
我有一个简单的 Scala 代码,它生成依赖于某些副作用的长数字。我将东西包装在一个 IO monad 中,但根据最小功率原则,我实际上将我的函数声明为 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)
此外,如果您对改进代码有任何建议,请告诉我。
问题是 F[_]: Effect
中绑定的上下文脱糖为隐式参数,因此编译器会看到类似这样的内容:
def generateId[F[_]](rid: Long)(implicit ev: Effect[F], F: Effect[F], ...): F[Long] = ...
这意味着每次它尝试解析方法主体中的隐式 Effect[F]
时,它都会失败,因为它认为显式 F
和这个合成 ev
模棱两可。
解决方案是删除上下文绑定或显式隐式 F: Effect[F]
参数。我建议取消上下文绑定,因为 Scala 允许您将两者结合起来的事实是很容易犯这种错误的部分原因(在我看来这是语言设计者的严重误判,因为我已经 said many times before).
这个问题以前可能被问过很多次,但是 none 的建议对我有帮助。
我有一个简单的 Scala 代码,它生成依赖于某些副作用的长数字。我将东西包装在一个 IO monad 中,但根据最小功率原则,我实际上将我的函数声明为 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)
此外,如果您对改进代码有任何建议,请告诉我。
问题是 F[_]: Effect
中绑定的上下文脱糖为隐式参数,因此编译器会看到类似这样的内容:
def generateId[F[_]](rid: Long)(implicit ev: Effect[F], F: Effect[F], ...): F[Long] = ...
这意味着每次它尝试解析方法主体中的隐式 Effect[F]
时,它都会失败,因为它认为显式 F
和这个合成 ev
模棱两可。
解决方案是删除上下文绑定或显式隐式 F: Effect[F]
参数。我建议取消上下文绑定,因为 Scala 允许您将两者结合起来的事实是很容易犯这种错误的部分原因(在我看来这是语言设计者的严重误判,因为我已经 said many times before).