Tôi cố gắng để làm như sau trong ít mã càng tốt và như chức năng càng tốt:Scala thể dục dụng cụ lập trình chức năng
def restrict(floor : Option[Double], cap : Option[Double], amt : Double) : Double
Rõ ràng các công việc sau:
= (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
}
Tôi đã thực sự hy vọng cho một cái gì đó thanh lịch hơn và sẽ chấp nhận việc sử dụng thư viện Scalaz! Bạn có thể giả định rằng sau đây là đúng:
floor.forall(f => cap.forall(_ > f))
Nếu có ai quan tâm, đây là một số mã kiểm tra:
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)
}
}
nào "hạn chế" chức năng giả sử để làm gì? – OscarRyz
Xin lỗi - nó phải trả về một Double dựa trên 'amt' được cung cấp nhưng được giới hạn hoặc sàn bởi các tham số tùy chọn. Đó là, nếu cung cấp 10 nhưng một nắp của một số (8), phương pháp nên trả lại 8 –