Как я могу создать анонимную функцию в scala?

Как я могу создать анонимную и каррированную функцию в Scala? Следующие два не удались:

scala> (x:Int)(y:Int) => x*y
<console>:1: error: not a legal formal parameter
       (x:Int)(y:Int) => x*y
              ^

scala> ((x:Int)(y:Int)) => x*y
<console>:1: error: not a legal formal parameter
       ((x:Int)(y:Int)) => x*y
               ^

person Niket Kumar    schedule 15.06.2012    source источник


Ответы (1)


Чтобы создать каррированную функцию, напишите ее так, как будто это несколько функций (на самом деле это так ;-)).

scala> (x: Int) => (y: Int) => x*y
res2: Int => Int => Int = <function1>

Это означает, что у вас есть функция от Int до функции от Int до Int.

scala> res2(3)
res3: Int => Int = <function1>

в качестве альтернативы вы можете написать это так:

scala> val f: Int => Int => Int = x => y => x*y
f: Int => Int => Int = <function1>
person drexin    schedule 15.06.2012
comment
Последнее выражение является именованной функцией, как мы можем написать то же самое в качестве анонимной функции? - person Niket Kumar; 15.06.2012
comment
Как в последнем выражении работает символ =›? х => у => х*у - person Niket Kumar; 15.06.2012
comment
У вас должно быть что-то, чему вы хотите передать функцию. если у вас есть метод/функция, например def foo(f: Int => Int => Int), вы можете вызвать ее как foo( x => y => x*y). - person drexin; 15.06.2012
comment
Анонимная функция @NiketKumar: {x => y => x * y}: (Int => Int => Int) - person senia; 15.06.2012
comment
@NiketKumar Последняя функция не является именованной. Или, скорее, это именованная функция арности 0, которая возвращает каррированную анонимную функцию. - person Daniel C. Sobral; 15.06.2012