edi*_*dio 4 scala scala-cats cats-effect
这或许曾多次被问过,但我找到的建议都没有帮助.
我有一个简单的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)
Run Code Online (Sandbox Code Playgroud)
[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)
Run Code Online (Sandbox Code Playgroud)
另外,如果您对改进代码有任何建议,请告诉我.
问题是上下文中的F[_]: Effectdesugars 绑定到一个隐式参数,所以编译器看到的是这样的:
def generateId[F[_]](rid: Long)(implicit ev: Effect[F], F: Effect[F], ...): F[Long] = ...
Run Code Online (Sandbox Code Playgroud)
这意味着每次它尝试解析Effect[F]方法体中的隐式时,它都会失败,因为它认为显式F和合成ev是不明确的.
解决方案是删除上下文绑定或显式隐式F: Effect[F]参数.我建议删除上下文绑定,因为Scala允许你将两者结合起来这一事实是因为它很容易造成这种错误(并且在我看来是语言设计者的一个严重错误判断,因为我"已经很多次表示).
| 归档时间: |
|
| 查看次数: |
354 次 |
| 最近记录: |