2014-07-11 3 views
-2

Пусть у меня есть следующий код:Частично применены функции и замыкания, ортогональные в Scala?

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

someNumbers.foreach(println _) 

val j = 10 

(x: Int) => x + j 

Мой вопрос частично примененные функции и затворов ортогональным в Scala?This presentation, кажется, предполагает, что они есть.


EDIT: 13 июля 2014 [Изменил код выше]

+3

Не могли бы вы проверить это довольно легко в repl? – KChaloux

+0

«Закрытие» - это еще одно слово для «Лямбда», это то же самое. –

+0

@ ElectricCoffee - это выражение лямбда, которое всегда позволяет использовать переменные за пределами своего собственного списка параметров? В противном случае я бы сказал, что это не то же самое, что закрытие. –

ответ

0

Это очень легко увидеть, что возвращается, когда вы идете в РЕПЛ:

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 то функция, которая не принимает никаких параметров

0

Извините, но ваш пример, кажется, не относятся к частичному применению, по крайней мере, для меня.

Вы просто используете синтаксис ярлыков для определения регулярных функций.

На самом деле gt, ge ... определения разлагаются на что-то очень, как

val gt: IntPairPred = (x: Int, y: Int) => x > y 
val gt: IntPairPred = (x: Int, y: Int) => x >= y 
//and so on... 

Regular модификации функции поддержки своих аргументов, но это не то, что вы ищете, я полагаю.

Чтобы определить замыкание, вы должны определить частичную функцию, ссылающийся на переменную во внешней области видимости, как

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 

Так что дело не в определении функций или частичного применения. Дело в том, что во время определения вы используете переменные из области закрытия внутри вашей функции. В этом случае на вашу функцию влияет переменная, которую вы закрыли.

Это вы, что искали?

 Смежные вопросы

  • Нет связанных вопросов^_^