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

时间:2019-07-08 12:32:55

标签: scala functional-programming

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

1 个答案:

答案 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以及如何使用它。