2010-07-29 25 views

risposta

29

È possibile restituire un tipo di funzione (definito da A => B). In questo caso Int a Int:

scala> def f(x:Int): Int => Int = { n:Int => x + n } 
f: (x: Int)(Int) => Int 

Quando si chiama la funzione si ottiene una nuova funzione.

scala> f(2) 
res1: (Int) => Int = <function1> 

che può essere chiamato come una funzione normale:

scala> res1(3) 
res2: Int = 5 
7

Una direzione (in qualche modo unico per oggetto-orientamento funzionale) è possibile utilizzare funzioni di ordine superiore è creare accoppiamenti flessibili tra oggetti.

Nell'esempio seguente, la classe Alarm ha un metodo check4Danger() che verifica se un valore calcolato supera DangerLevel. La classe Alarm non sa nulla degli oggetti che la chiamano.

La classe Car ha un metodo engineCrashRisk() che restituisce una funzione anonima che calcola il rischio di arresto anomalo del motore. Car non ha dipendenza da allarme.

case class Alarm(temperature: Double, pressure: Double){ 
    val DangerLevel = 100000.0 
    def check4Danger(f: (Double, Double) => Double): Boolean = { 
    val risk = f(temperature, pressure) 
    if(risk > DangerLevel){ 
     println("DANGER: "+ risk) 
     true 
    }else{ 
     println("Safe: " + risk) 
     false 
    } 
    } 
} 

case class Car(fuelRate: Double, milage: Int){ 
    def engineCrashRisk() = 
    (temperature: Double, pressure: Double) => 
     temperature * milage + 2*pressure/fuelRate 
} 


val car = Car(0.29, 123) 
val riskFunc = car.engineCrashRisk 

val alarm = Alarm(124, 243) 
val risk = alarm.check4Danger(riskFunc) 

L'output di questo script è:

Safe: 16927.862068965518 

In questo esempio abbiamo usato funzioni anonime con chiusure di creare un metodo libero chiamata dipendenza tra i Alarm e Car oggetti. Questo esempio ha senso?

+0

+ 1, Offtopic a parte: Si prega di cambiare 'DANGER_LEVEL' su' DangerLevel'. Il libro di Odersky raccomanda l'uso di PascalCase per le costanti. – missingfaktor

+4

@ Rahuλ No merda! Questa raccomandazione sembra totalmente non ortodossa, ma chi sono io per mettere in discussione la volontà del nostro grande leader :-) –

Problemi correlati