Scala функциональные литералы - PullRequest
7 голосов
/ 19 мая 2019
  1. val x = (x:Int, y:Int) => (_:Int) + (_:Int)
  2. val y = (_:Int) + (_:Int)

В приведенных выше двух функциональных литералах в Scala, когда я вызываю первый (например, x (2,3)), он не возвращает сумму. Скорее он возвращает другой результат, скажем, res0 Когда я вызываю res0 (2,3), тогда он возвращает мне сумму. Тогда как второй возвращает ответ в самом первом вызове (скажем, у (2,3) дает мне 5).

Может кто-нибудь объяснить, почему первый не возвращает мне сумму (которая равна 5) в самом первом вызове.

Я пытался в REPL.

Ответы [ 2 ]

9 голосов
/ 19 мая 2019

Может быть полезно написать полные типы x и y, например,

val x: (Int, Int) => (Int, Int) => Int = 
  (a: Int, b: Int) => (_: Int) + (_: Int)

val y: (Int, Int) => Int = 
  (_: Int) + (_: Int)

Здесь мы видим, когда x применяется к двум аргументам, он возвращает еще одну функцию типа

(Int, Int) => Int

Обратите внимание, что сокращение

(_: Int) + (_: Int)

эквивалентно

(a: Int, b: Int) => a + b
3 голосов
/ 20 мая 2019
val x = (x:Int, y:Int) => (_:Int) + (_:Int)

эквивалентно

val x = (x : Int, y : Int) => ((arg1:Int, arg2:Int) => (arg1:Int) + (arg1:Int))

Пока

val y = (_:Int) + (_:Int)

эквивалентно

(x:Int, y:Int) => (x:Int) + (x:Int)
...