首页 > 解决方案 > 如何在scala函数式编程中实现db操作

问题描述

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

标签: scalafunctional-programming

解决方案


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

基本上,我们可以做的是“作弊”,将所有不纯的代码(正在执行任何副作用)包装在效果上,这通常称为IO monad。使用IO包装的不纯操作在显式启动之前不会执行(通常通过调用名为unsafeRun的方法)。而且由于包装的动作只是值,您可以从函数中返回它们,分配给变量并执行您对普通值所做的一切:

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有几种实现: ZIOCats-EffectMonix。对于纯函数式数据库通信,您可以使用适用于任何这些 monad 的Doobie 。

我建议你观看 John de Goes FP to the max 的演讲,它很好地解释了什么是 IO monad 以及如何使用它。


推荐阅读