我对Scala和函数式编程非常陌生。我已经读到我们不应该在FP中产生任何副作用(例如DB和IO操作)。我想知道我们如何在Scala中处理数据库操作?
答案 0 :(得分:5)
如果您想创建一个纯粹的功能性应用程序,那么您将不会产生任何副作用,但是如果没有副作用,我们怎么能做任何有用的事情(将文本写入控制台,从数据库读取数据等)?
基本上,我们可以通过将所有不纯净的代码(正在执行任何副作用)包装在effect中来进行“作弊” ,通常将其称为 IO < / em> monad。除非明确启动(通常通过调用名为 unsafeRun 的方法),否则用 IO 包裹的不正确操作才会执行。而且,由于包装的动作只是值,因此您可以从函数中返回它们,将其分配给变量,并可以执行使用纯值的所有操作:
import cats.effect.IO //you'd have to add cats-effect dependency to make this import work
val printHelloToConsole = IO(println("Hello")) //nothing is happening yet
printHelloToConsole.unsafeRunSync // starting performin effects
该操作的主要目的是尝试将纯功能代码与应用程序的不纯部分分离。马丁·奥德斯基的话:
IO monad不能使函数变纯。显然这是不纯的。
Scala的 IO Monad 有几种实现方式: ZIO , Cats-Effect , Monix 。对于纯功能数据库通信,可以使用Doobie,它可以与任何这些monad一起使用。
我建议您观看John de Goes FP to the max的演讲,它很好地解释了什么是IO monad以及如何使用它。