2010-07-29 69 views

回答

29

您可以返回一個函數類型(這是由A => B定義的)。在這種情況下Int to Int:

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

當您調用該函數時,您將獲得一個新函數。

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

可以稱之爲作爲一個正常的功能:

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

的一種方式(有些獨特的功能性面向對象),可以使用高階函數是創建對象之間的鬆散耦合。

在下面的示例中,類Alarm有一個方法check4Danger(),該方法檢查計算值是否超出DangerLevel。 Alarm類不知道任何關於調用它的對象。

Car類有一個方法engineCrashRisk(),該方法返回一個計算髮動機故障風險的匿名函數。 Car對鬧鐘沒有依賴性。

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) 

這個腳本的輸出是:

Safe: 16927.862068965518 

在這個例子中,我們使用匿名函數帶密封蓋創建AlarmCar對象間的依賴性免費方法調用。這個例子有什麼意義嗎?

+0

+ 1,Offtopic旁邊:請將'DANGER_LEVEL'改爲'DangerLevel'。 Odersky書中推薦使用PascalCase作爲常量。 – missingfaktor 2010-07-29 18:04:26

+4

@Rahuλ沒有狗屎!這個建議感覺完全是非正統的,但我是誰來質疑我們偉大的領導者的意志:-) – 2010-07-30 05:46:14