我正在准备有关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
)而导致的结果。函数(在我们的示例中的注释之间标记)是一个实际的关闭。我很好。只要您了解技术原理,就很容易找到绕开术语的方法。