如何在Scala函数式编程中实现db操作

Vip*_*pin 1 functional-programming scala

我对Scala和函数式编程很陌生。我已经读到我们不应该在FP中产生任何副作用(例如DB和IO操作)。我想知道如何在Scala中处理数据库操作?

Krz*_*sik 6

如果您想创建一个纯粹的功能性应用程序,那么您将不会产生任何副作用,但是如果没有副作用,我们怎么能做任何有用的事情(将文本写入控制台,从数据库中读取数据等)?

基本上,我们所能做的就是“欺骗”通过包装的所有代码,是不是纯粹的(正在执行任何副作用)的影响,其通常被称为IO单子。直到明确启动(通常通过调用名为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
Run Code Online (Sandbox Code Playgroud)

该操作的主要目的是尝试从应用程序的不纯部分中分离纯功能代码。马丁·奥德斯基的话:

IO monad不会使函数变纯。显而易见,这是不纯的。

IO Monad for Scala 有多种实现:ZIOCats-EffectMonix。对于纯功能的数据库通信,您可以使用适用于所有这些monad的Doobie

我建议您观看John de Goes FP与max的对话,它很好地解释了什么是IO monad以及如何使用它。