我正在准备有关Scala和函数式编程的演示文稿,但我不确定这两个概念。

在演示过程中,我使用了前面介绍的功能:

def safe_division(x: Int, y: Int) : Option[Double] = {
  if(y != 0)
    Some(x / y.toDouble)
  else
    None
}


我创建了一个咖喱版本(如果我记错了,请纠正我!):

val curried_safe_division: (Int) => (Int) => Option[Double] = {
  (x) =>
    (y) =>
      if(y != 0)
        Some(x / y.toDouble)
      else
        None
}


因此,我不确定的第一部分是“ curried_safe_division称为咖喱吗?”

然后,我介绍一些代码来展示循环函数如何使程序员有效地重用功能:

val divideSix = curried_safe_division(6)
divideSix(3)
// prints: Some(2.0)
divideSix(6)
// prints: Some(1.0)


我在这里说divideSix是闭包吗?
curried_safe_division也不是闭包吗?
我正在使用此定义:


https://softwareengineering.stackexchange.com/a/40708
可以存储为变量的函数(称为“一流函数”),具有访问其创建范围本地的其他变量的特殊功能。


我在线阅读了多个资源,维基百科页面和以下stackoverflow问题:What is a 'Closure'?,但仍不是很清楚

最佳答案

curried_safe_division是一个函数。这不同于safe_division,后者是一种方法。

此外,curried_safe_division是咖喱函数。当您使用safe_division并将其转换为函数时,通常会得到(Int, Int) => Option[Double]。通过将其更改为Int => Int => Option[Double],可以管理该函数。

函数divideSix不是闭包。这是一个简单的函数,需要一个整数并返回一个整数。但是,闭包是curried_safe_division中的内部函数:

val curried_safe_division: (Int) => (Int) => Option[Double] =
    (x) =>
    // function below is a closure
      (y) =>
        if(y != 0)
          Some(x / y.toDouble)
        else
          None
    // end of closure
  }


您可以清楚地看到它依赖于x,但没有将其作为自己的参数。而是使用外部作用域中的x。它“关闭x”。当您说val divideSix = curried_safe_division(6)时,您将使用该闭包,并为其提供6作为参数x的值,并将其分配给divideSix。但是divideSix本身不是闭包。它不会关闭任何东西。它只需要一个整数参数,然后将其除以六。

我已经看到有些人倾向于将结果函数值(在我们的示例中为divideSix)称为“关闭”,因为它是部分应用某些函数(在本示例中为curried_safe_division)而导致的结果。函数(在我们的示例中的注释之间标记)是一个实际的关闭。我很好。只要您了解技术原理,就很容易找到绕开术语的方法。

07-24 13:50