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

时间:2014-07-11 13:34:47

标签: 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中部分应用的函数和闭包是正交的吗? This presentation似乎表明它们是正确的。


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

2 个答案:

答案 0 :(得分:0)

当您进入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

gtfunction2,即一个带2个参数的函数

这是另一个例子:

scala> def fn(a: Int, b: Int) = () => a + b
fn: (a: Int, b: Int)() => Int

scala> val a = fn(2,3)
a: () => Int = <function0>

fn返回的内容是function0,即不带任何参数的函数

答案 1 :(得分:0)

很抱歉,但您的示例似乎并未提及部分申请,至少对我而言。

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

实际上gtge,......定义会扩展为非常类似

的内容
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

所以重点不在于函数定义或部分应用程序。关键是,在定义时,您是否在函数中使用了结束范围内的变量。在这种情况下,您的函数会受到您关闭的变量的影响。

这是你追求的吗?