2015-01-30 2 views
0

В ниже код:Scala оценка функции

object typeparam { 

    val v = new MyClass[Int]      //> v : typeparam.MyClass[Int] = [email protected] 

    def f1(a : Int) = { 
    println("f here") 

    3 
    }            //> f1: (a: Int)Int 

    v.foreach2(f1)         //> foreach2 

    class MyClass[A] { 

    def foreach2[B](f: B => A) = { 
     println("foreach2") 
     f 
    } 

    } 

} 

Почему функция f1 не вызывается в функции foreach2?

Если я вместо этого использовать

object typeparam { 

    val v = new MyClass[Int]      //> v : typeparam.MyClass[Int] = [email protected] 

    def f1() = { 
    println("f here") 
    }            //> f1:()Unit 

    v.foreach2(f1)         //> f here 
                //| foreach2 

    class MyClass[A] { 

    def foreach2[B](f: Unit) = { 
     println("foreach2") 
     f 
    } 

    } 

} 

Функция f1, как представляется, получить оценку, прежде чем foreach2, как "F здесь" выводится перед "foreach2". Почему это так ?

ответ

3

Поскольку вы не вызываете его, вы возвращаете его в результате, выведенный тип результата вашей функции foreach2 будет Int => Int. Вам нужно вызвать эту функцию с помощью некоторого аргумента. Во втором случае применяются специальные правила, вы можете вызывать функцию вроде f1 (которая не принимает аргументы) без фигурных скобок, поэтому в основном вы привязываете результат вызова f1 (без привязок) к параметру f вашей функции foreach2.

+0

'f' принимает аргумент ... – sschaef

+0

@sschaef спасибо, пропустили эту точку, исправили. – 4lex1v

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