2012-04-03 11 views
6

Jestem nowy Scala, i stara się zrozumieć następujące kody (pochodzący z przykładu na początku Scala książka)Jak może (1 +) być kiedykolwiek funkcją?

scala> def w42(f: Int => Int) = f(42) //(A) 
w42: (f: Int => Int)Int 

scala> w42 (1 +)  //(B) 
res120: Int = 43 

ja nie rozumiem, jak „1 +” w punkcie (b) jest pod uwagę jako funkcja (wziąć 1 parametr Int i zwrócić wartość Int), która spełnia definicję w42 w punkcie (A)?

Czy mógłbyś wyjaśnić lub wskazać mi niektóre dokumenty, które mają odpowiedź?

Odpowiedz

11

Prosty. W Scala 1 + 2 jest po prostu składnia cukru ponad 1.+(2). Oznacza to Int ma metodę nazwie + który akceptuje Int:

final class Int extends AnyVal { 
    def +(x: Int): Int = //... 
    //... 
} 

Dlatego można użyć 1 + jakby to była funkcja. Przykład dla metody mniej nieoczekiwane nazwy:

scala> def s42(f: String => String) = f("42") 
s42: (f: String => String)String 

scala> s42("abc".concat) 
res0: String = abc42 

okazji technicznego punktu widzenia eta rozprężania bierze również udział konwersji metody funkcji.

+4

Może jakaś użyteczna wskazówka: '1 +' oznacza '1 + _' oznacza' x => 1 + x' – sschaef

+0

Dzięki Tomaszowi za dodatkowy przykład. – lastrinh1296773

+0

Dzięki Antoras za przydatną wskazówkę – lastrinh1296773

Powiązane problemy