2010-07-29 6 views

Respuesta

29

Puede devolver un tipo de función (esto está definido por A => B). En este caso Int to Int:

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

Cuando llama a la función, obtiene una nueva función.

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

que puede ser llamado como una función normal:

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

Una forma (algo único a funcional orientación a objetos) puede utilizar las funciones de orden superior es crear acoplamientos sueltos entre los objetos.

En el ejemplo siguiente, la clase Alarm tiene un método check4Danger() que comprueba si un valor calculado supera el DangerLevel. La clase de alarma no sabe nada sobre los objetos que lo llaman.

La clase Car tiene un método engineCrashRisk() que devuelve una función anónima que calcula el riesgo de bloqueo del motor. Car no tiene dependencia a la alarma.

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) 

La salida de este script es:

Safe: 16927.862068965518 

En este ejemplo hemos usado funciones anónimas con cierres para crear una dependencia método libre llamada entre los Alarm y Car objetos. ¿Este ejemplo tiene algún sentido?

+0

+ 1, A un lado de Offtopic: cambie 'DANGER_LEVEL' por' DangerLevel'. El libro de Odersky recomienda el uso de PascalCase para las constantes. – missingfaktor

+4

@ Rahuλ ¡No mierda! Esta recomendación se siente totalmente heterodoxa, pero ¿quién soy para cuestionar la voluntad de nuestro gran líder? :-) –

Cuestiones relacionadas