假设我有以下代码:
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日[更改上述代码]
答案 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
gt
是function2
,即一个带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)
很抱歉,但您的示例似乎并未提及部分申请,至少对我而言。
您只是使用一些快捷语法来定义常规函数。
实际上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
所以重点不在于函数定义或部分应用程序。关键是,在定义时,您是否在函数中使用了结束范围内的变量。在这种情况下,您的函数会受到您关闭的变量的影响。
这是你追求的吗?