考慮到返回另一個功能的功能:是否可以強制早期評估咖喱功能?
def prepareFunction(args: List[Any]): String => Unit = {
println(s"Slow processing of $args...")
val results = args.map(a => s"processed $a")
def doSomething(s: String): Unit = {
println(s"Do something quick with $s and $results")
}
doSomething
}
這裏的想法是:一個外函數做一些繁重的處理,並返回一個使用在封閉範圍定義的變量一個內部函數:
val doSomethingWithArgs = prepareFunction(List("arg1", "arg2", 3))
//> Slow processing of List(arg1, arg2, 3)...
doSomethingWithArgs("abc")
//> Do something quick with abc and List(processed arg1, processed arg2, processed 3)
doSomethingWithArgs("cde")
//> Do something quick with cde and List(processed arg1, processed arg2, processed 3)
請注意,外部函數只被評估一次。
對於多個參數列表和Scala的Currying syntax我們可以寫類似的東西:
def prepareCurried(args: List[Any])(s: String): Unit = {
println(s"Slow processing of $args")
val results = args.map(a => s"processed $a")
def doSomething(s: String): Unit = {
println(s"Do something quick with $s and $results")
}
doSomething(s)
}
但「外」功能獲取評估每次:
val doSomethingWithOtherArgs = prepareCurried(List(4, 5, 6)) _
doSomethingWithOtherArgs("abc")
//> Slow processing of List(4, 5, 6)
//> Do something quick with abc and List(processed 4, processed 5, processed 6)
doSomethingWithOtherArgs("cde")
//> Slow processing of List(4, 5, 6)
//> Do something quick with cde and List(processed 4, processed 5, processed 6)
我的問題是,我可以採用某種力量prepareCurried
要在波紋管上進行評估?
val doSomethingWithOtherArgs = prepareCurried(List(4, 5, 6)) _
換一種說法,是有可能得到相同的效果"evaluation on definition"當部分應用與多參數列表的功能?
這就是curried函數應該如何按照定義行爲,我想不出爲什麼要改變它。你已經在你的模式1中有其他選擇。 –
嘿@Sarvesh,沒有特別的理由,我只是想知道currying和返回函數的函數之間的對稱性。 –