Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala函数式编程中db操作的实现_Scala_Functional Programming - Fatal编程技术网

scala函数式编程中db操作的实现

scala函数式编程中db操作的实现,scala,functional-programming,Scala,Functional Programming,我对Scala和函数式编程相当陌生。我已经读到,我们不应该在FP中产生任何副作用(例如:DB和IO操作)。我想知道我们如何在Scala中处理DB操作?如果你想创建一个纯功能的应用程序,你不能做任何副作用,但没有副作用,我们如何做有用的事情(向控制台写入文本,从数据库读取数据等) 基本上,我们可以通过包装所有非纯代码(执行任何副作用)来实现“欺骗”,其中通常称为IO monad。直到显式启动(通常通过调用名为unsafeRun的方法)才执行用IO包装的不纯操作。由于包装动作只是值,您可以从函数返回

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

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

基本上,我们可以通过包装所有非纯代码(执行任何副作用)来实现“欺骗”,其中通常称为IO 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
该操作的主要目的是试图将纯功能代码与应用程序的不纯部分分开。引用Martin Odersky的话:

IO单子不能使函数成为纯函数。它只是让人觉得它很不纯

Scala的IO Monad有几种实现方式:ZIOCats EffectMonix。对于纯功能数据库通信,您可以使用与这些单子中的任何一个一起工作的


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

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

基本上,我们可以通过包装所有非纯代码(执行任何副作用)来实现“欺骗”,其中通常称为IO 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
该操作的主要目的是试图将纯功能代码与应用程序的不纯部分分开。引用Martin Odersky的话:

IO单子不能使函数成为纯函数。它只是让人觉得它很不纯

Scala的IO Monad有几种实现方式:ZIOCats EffectMonix。对于纯功能数据库通信,您可以使用与这些单子中的任何一个一起工作的


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

您可以看看Doobie,它是Scala的纯功能JDBC层,只需分享我的两分钱,即使您更喜欢做的事情是Krzysztof所说的(我也会这么做)。我知道,完全FP需要时间,如果你只是在学习Scala,那可能是一种过火的行为。此外,我建议先了解
IO
(至少从概念角度来看)的优势,然后再将其用作“货物崇拜”。因此,我建议您首先将Scala作为一种语言学习,然后学习FP(Scala with cats是一个很好的首选),然后学习如何将副作用转换为纯值(cats effect documentation)。现在,我建议您尝试将纯函数与外部世界分离。确保您的业务逻辑没有受到任何有效的影响,这是第一步。如果您能够对80%的代码进行推理,那么
IO
将帮助您处理剩余的20%。-但再一次,这只是我的观点:)感谢路易斯·米格尔·梅西亚·苏亚雷斯的建议,非常感谢:)有purust、幻想家和学者。你可以看看Doobie,它是Scala的一个纯功能JDBC层,只需分享我的两分钱,即使我更喜欢做Krzysztof所说的(我也会这么做)。我知道,完全FP需要时间,如果你只是在学习Scala,那可能是一种过火的行为。此外,我建议先了解
IO
(至少从概念角度来看)的优势,然后再将其用作“货物崇拜”。因此,我建议您首先将Scala作为一种语言学习,然后学习FP(Scala with cats是一个很好的首选),然后学习如何将副作用转换为纯值(cats effect documentation)。现在,我建议您尝试将纯函数与外部世界分离。确保您的业务逻辑没有受到任何有效的影响,这是第一步。如果您能够对80%的代码进行推理,那么
IO
将帮助您处理剩余的20%。-但再一次,这只是我的观点:)感谢路易斯·米格尔·梅西亚·苏亚雷斯的建议,非常感谢:)有purust、幻想家和学者。还有一些人意识到没有副作用意味着什么都没有。