scala - 如何在scala函数式编程中实现db操作
问题描述
我对 Scala 和函数式编程很陌生。我读过我们不应该在 FP 中产生任何副作用(例如:DB 和 IO 操作)。我想知道我们如何在 Scala 中处理数据库操作?
解决方案
如果你想创建一个纯功能的应用程序,你不能做任何副作用,但没有副作用我们怎么能做任何有用的事情(将文本写入控制台,从数据库读取数据等)?
基本上,我们可以做的是“作弊”,将所有不纯的代码(正在执行任何副作用)包装在效果上,这通常称为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有几种实现: ZIO、Cats-Effect、Monix。对于纯函数式数据库通信,您可以使用适用于任何这些 monad 的Doobie 。
我建议你观看 John de Goes FP to the max 的演讲,它很好地解释了什么是 IO monad 以及如何使用它。
推荐阅读
- reactjs - 如何更改 ionic v4 React 上的 onClick 元素?
- php - Laravel 不显示来自 url 的图像
- sql - 如何在id上合并两个表sql?
- c# - Gridview 列未设置为我输入的宽度
- r - 在带有管道函数的向量中应用 is.na() 函数
- ios - 编辑 UILable,隐藏 inputAccessoryView [swift 5]
- angular - Angular Mat-Slide-Toggle 响应缓慢
- python - 试图从 yelp 中获取线索
- haskell - Haskell 使用索引从字符串矩阵递归地将数据元素添加到矩阵
- r - 使用 rtweet 从推文中获取媒体