Scala 功能性试验;抓住斯卡拉

Scala 功能性试验;抓住斯卡拉,scala,functional-programming,Scala,Functional Programming,在Scala中打开资源并对其应用方法是否有比此方法(直接从java翻译)更惯用的方法: 使用(死链接)。这可能是一种不希望正常工作的情况。allready提到的贷款模式只是错误处理重要版本的封装,但它与函数式编程无关,也不负责错误处理 如果你真的想让它功能化,你可以用一个。出于充分的理由,我提供的链接是针对Haskell的特定文档,因为Scala不太支持这种“硬核”功能实践 我建议你走强制性的道路,最后用try-catch。。。您还可以使用错误处理扩展loan模式,但这意味着您必须编写特殊函数,

在Scala中打开资源并对其应用方法是否有比此方法(直接从java翻译)更惯用的方法:


使用(死链接)。

这可能是一种不希望正常工作的情况。allready提到的贷款模式只是错误处理重要版本的封装,但它与函数式编程无关,也不负责错误处理

如果你真的想让它功能化,你可以用一个。出于充分的理由,我提供的链接是针对Haskell的特定文档,因为Scala不太支持这种“硬核”功能实践


我建议你走强制性的道路,最后用try-catch。。。您还可以使用错误处理扩展loan模式,但这意味着您必须编写特殊函数,如果您想在某些情况下以不同的方式处理错误,或者您必须传递部分函数以进行错误处理(这只是您在代码中的catch块中准备好的)

在github上的Josh Suereth图书馆中,贷款模式以各种方式实现

然后,您可以使用如下资源:

val result = managed(new FileInputStream(in)).map(func(_)).opt 
它将返回封装在
选项中的
func
的结果,并负责关闭输入流

要在创建资源时处理可能的异常,可以与
scala.util.control.Exception
对象组合使用:

import resource._
import util.control.Exception.allCatch

allCatch either { 
  managed(new FileInputStream(in)).map(func(_)).opt 
} match {
  case Left(exception) => println(exception)
  case Right(Some(result)) => println(result)
  case _ =>
}

从Scala 2.13开始,标准库提供了一个专用的资源管理实用程序:

在这种情况下,它可以与as一起使用,以便播放输入文件,并且无论发生什么情况,都可以在之后关闭文件资源:

import scala.util.{Using, Failure}
import java.io.FileInputStream

Using(new FileInputStream(in)) {
  is => func(is)
}.recoverWith {
  case e: java.io.IOException =>
    println("Error: could not open file.")
    Failure(e)
}

由于
使用
会产生一个提供操作结果或错误的异常,因此我们可以通过处理异常。

Scala标准库中是否有这方面的标准实现,还是我应该在一个util模块中创建自己的链接?@aharon请看下面的评论——Josh Suereth的ARM库可以做到这一点。@winmyohet:现在它已经存在了,但现在有一条说明说它们不鼓励创建永久链接。您可以尝试“自动资源管理”库:(我没有使用它)您正在寻找一种称为“自动资源管理”的功能,这是Java 7为数不多的功能之一。我们需要monad吗?在Haskell中有
括号
函数,它也在Scalaz中实现。
import scala.util.{Using, Failure}
import java.io.FileInputStream

Using(new FileInputStream(in)) {
  is => func(is)
}.recoverWith {
  case e: java.io.IOException =>
    println("Error: could not open file.")
    Failure(e)
}