部分应用的函数和闭包在Scala中是正交的吗?

部分应用的函数和闭包在Scala中是正交的吗?,scala,lambda,closures,partial-application,Scala,Lambda,Closures,Partial Application,假设我有以下代码: val someNumbers = List(-11, -10, -5, 0, 5, 10) someNumbers.foreach( println _ ) val j = 10 (x: Int) => x + j 我的问题是在Scala中部分应用函数和闭包是正交的吗?似乎表明它们是正交的 编辑:2014年7月13日[上面更改的代码]进入repl时,很容易看到返回的内容: scala> type IntPairPred = (Int, Int) =&g

假设我有以下代码:

val someNumbers = List(-11, -10, -5, 0, 5, 10)

someNumbers.foreach( println _ )

val j = 10

(x: Int) => x + j
我的问题是在Scala中部分应用函数和闭包是正交的吗?似乎表明它们是正交的



编辑:2014年7月13日[上面更改的代码]

进入repl时,很容易看到返回的内容:

scala> type IntPairPred = (Int, Int) => Boolean
defined type alias IntPairPred

scala> val gt: IntPairPred = _ > _
gt: IntPairPred = <function2>

scala> gt(2,3)
res3: Boolean = false

fn
返回的是一个
函数0
,即一个不带任何参数的函数

对不起,但您的示例似乎并没有提到部分应用程序,至少对我来说是这样

您只是使用一些快捷语法来定义常规函数

实际上,
gt
ge
。。。定义被扩展为类似于

val gt: IntPairPred = (x: Int, y: Int) => x > y
val gt: IntPairPred = (x: Int, y: Int) => x >= y
//and so on...
常规函数支持修改其参数,但我想这不是您想要的

要定义闭包,应该定义引用外部范围中变量的分部函数,如

var one = 1
val gt1 = gt(1, _: Int)

assert(gt1(0))  //ok
assert(!gt1(1)) //ok

one = 2 //weirdo!
assert(gt1(0))  //ok
assert(gt1(1)) //ok
assert(!gt1(2)) //ok
所以重点不在函数定义或部分应用中。关键是,在定义时,您是否在函数中使用结束作用域中的变量。在这种情况下,函数受关闭变量的影响


这就是你想要的吗?

你能在repl中很容易地测试一下吗?“Closure”只是“Lambda”的另一个词,它们是一样的thing@ElectricCoffeelambda表达式是否始终允许使用自己参数列表之外的变量?否则,我会说这与闭包不同。@Pagota_5b从纯FP的角度来看,不。@ElectricCoffee:错。看看:
var one = 1
val gt1 = gt(1, _: Int)

assert(gt1(0))  //ok
assert(!gt1(1)) //ok

one = 2 //weirdo!
assert(gt1(0))  //ok
assert(gt1(1)) //ok
assert(!gt1(2)) //ok