2015-04-24 3 views
0

В Javascript, я бы написать функцию высшего порядка возвращения и другую функцию таким образом:Как написать нетривиальную функцию, возвращающую функцию в Scala?

var f = function(x) { 
    return function(y) { 
    // something using x and y 
    } 
} 

Синтаксис Scala для этого, кажется:

def f(x: Any)(y: Any) = // Something with x and y 

это хорошо, если вы никогда не должны делать ничего перед созданием возвращаемой функции. Но предположим, что вы должны были обработать х как-то перед созданием функции возврата (пример снова в Javascript):

var f = function(x) { 
    // Something using x 
    return function(y) { 
    // something using y based on the above logic 
    } 
} 

documentation неясно, по этому вопросу.

+1

Синтаксис Вы упоминали для методов. Проверьте lambdas вместо: http://docs.scala-lang.org/tutorials/tour/anonymous-function-syntax.html –

+0

Спасибо за ссылку! Не знал, что синтаксис отличается от методов против функций. –

ответ

5

Например, при вызове следующей функции:

def hof(i:Int) = (x:Int) => x + i 

возвращает Int => Int функцию, то есть один, который будет принимать Int и вернуть Int. В вашем случае вы можете сделать так:

def hof(i:Int) = { 
    // do some other stuff.... 

    (x:Int) => i + x //the last statement, so this function will be returned. 
} 
1

Вы можете Expliclty вернуть функцию вместо использования отдельных списков параметров, например.

def f(x: Any) = { 
    //something using x 
    (y: Any) => //something with x and y 
} 

или

val f: (Any => (Any => Any)) = x => { 
    //something using x 
    y => //something with x and y 
} 
+0

Спасибо, но это на самом деле не отвечает на вопрос. Я ищу, как выполнить некоторую логику в первоначальном вызове, прежде чем строить функцию возврата. –

+0

@PeterBratton - См. Обновление. – Lee

+0

Лучше! Спасибо! –

1

Как сказал @Chirlo, Int => Int обозначает функцию.

A => B просто синтаксический сахар для признака FunctionN[A,B] где

  • A представляет собой входа, Type
  • Bвыхода типа
  • FunctionN варьируется в зависимости от числа входов: Function1 Принимает 1 вход, Function2 принимает 2 входа ...

Таким образом, используя пример Chirlo, в

def hof(i:Int) = { 
    // do some other stuff.... 

    (x:Int) => i + x //the last statement, so this function will be returned. 
} 

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

def hof = new Function1[Int,Function1[Int,Int]] { 
    def apply(i:Int) = new Function1[Int,Int] {  
     def apply(x:Int) = i + x 
    } 
} 
Смежные вопросы