Scala redis4cats 库
redis: RedisCommands[IO, String, String]
redis.set("a", "x")
127.0.0.1:6379[2]> set a b OK
我认为这是由于对
IO
的api的混淆造成的
您的代码,
redis.set("a", "x")
返回类型为IO[Unit]
的值
IO
类型的值是稍后将执行的计算的plan。它是“引用透明”的,这意味着它与像1 + 1
这样的值相同
这意味着,例如,这两个程序在语义上是等价的:
IO.println("hi") >> IO.println("hi")
val hi = IO.println("hi")
hi >> hi
与使用非IO对比:
println("hi"); println("hi")
val hi = println("hi")
hi; hi
这两个程序不等价- println 不是引用透明的。
这就意味着如果不使用
IO
值,就相当于永远不会构造它。
也就是说,方法
foo
和bar
是等价的:
def foo = {
redis.set("a", "x")
123
}
def bar = {
123
}
处理您的案例的最佳方法是确保您构建的
redis.set
程序已合并到来自更高层代码部分的 flatMap
中,例如,
def setA: IO[Unit] = redis.set("a", "x") >> IO.println("'a' has been set")
如果您的代码库的其余部分未使用
IO
,您可以改为使用“unsafe
”方法之一来立即执行您的 IO
值描述的程序。在这种情况下,名称“不安全”指的是不再保留参照完整性的事实,这意味着您不能将等式推理应用于代码。
// Import the default IORuntime to execute your `IO` program
import cats.effect.unsafe.implicits._
def doStuff: Unit = {
redis.set("a", "x").unsafeRunSync()
println("done"
}
def doStuffAsync: Future[Unit] =
redis.set("a", "x").unsafeToFuture()
我推荐阅读 cats-effect 和 fs2 的一位作者的 “程序作为价值” 系列文章,它更详细地介绍了为什么库以这种方式构建以及使用它可以启用哪些功能。