我試圖做盡可能少的代碼儘可能以下,並在功能上儘可能:Scala的函數式編程體操
def restrict(floor : Option[Double], cap : Option[Double], amt : Double) : Double
顯然以下工作:
= (floor -> cap) match {
case (None, None) => amt
case (Some(f), None) => f max amt
case (None, Some(c)) => c min amt
case (Some(f), Some(c)) => (f max amt) min c
}
我真的很希望更優雅的東西,並會接受使用圖書館的Scalaz! 你可以假設以下條件爲真:
floor.forall(f => cap.forall(_ > f))
如果有人有興趣,這裏是一些測試代碼:
object Comparisons {
sealed trait Cf {
def restrict(floor: Option[Double], cap: Option[Double], amt: Double): Double
}
def main(args: Array[String]) {
val cf : Cf = //TODO - your impl here!
def runtest(floor: Option[Double], cap: Option[Double], amt: Double, exp : Double) : Unit = {
val ans = cf.restrict(floor, cap, amt)
println("floor=%s, cap=%s, amt=%s === %s (%s) : %s".format(floor, cap, amt, ans, exp, if (ans == exp) "PASSED" else "FAILED"))
}
runtest(Some(3), Some(5), 2, 3)
runtest(Some(3), Some(5), 3, 3)
runtest(Some(3), Some(5), 4, 4)
runtest(Some(3), Some(5), 5, 5)
runtest(Some(3), Some(5), 6, 5)
runtest(Some(3), None, 2, 3)
runtest(Some(3), None, 3, 3)
runtest(Some(3), None, 4, 4)
runtest(Some(3), None, 5, 5)
runtest(Some(3), None, 6, 6)
runtest(None, Some(5), 2, 2)
runtest(None, Some(5), 3, 3)
runtest(None, Some(5), 4, 4)
runtest(None, Some(5), 5, 5)
runtest(None, Some(5), 6, 5)
runtest(None, None, 2, 2)
runtest(None, None, 3, 3)
runtest(None, None, 4, 4)
runtest(None, None, 5, 5)
runtest(None, None, 6, 6)
}
}
什麼是「限制」功能,該做的? – OscarRyz 2010-11-10 15:22:39
對不起 - 它必須根據提供的'amt'返回一個Double,但是它是由可選參數設置的上限或下限。也就是說,如果提供了10但是Some(8)的上限,該方法應該返回8 – 2010-11-10 18:07:36