【发布时间】:2023-03-13 23:35:01
【问题描述】:
假设我正在编写一个具有两个功能的玩具税计算器:
// calculate the tax amount for a particular income given tax brackets
def tax(income: BigDecimal, brackets: Seq[Bracket]): BigDecimal = ???
// calculate the min. income for a particular tax rate given tax brackets
def income(taxRate: BigDecimal, brackets: Seq[Bracket]) = ???
我这样定义一个税级:
case class Bracket(maxIncomeOpt: Option[BigDecimal], rate: BigDecimal)
Bracket(Some(BigDecimal(10)), BigDecimal(10)) 表示10% 的税级,用于收入超过10
Bracket(Some(BigDecimal(20)), BigDecimal(20)) 表示20% 的税级高于20Bracket(None, BigDecimal(30)) 表示30% 的税级用于任何收入
现在我正在编写函数tax,如下所示:
def tax(income: BigDecimal, brackets: Seq[Bracket]): BigDecimal = {
val (_, result) = brackets.foldLeft((BigDecimal(0), income)) { case ((result, rest), curr) =>
val taxable = curr.maxIncomeOpt.fold(rest)(_.min(rest))
(result + taxable * curr.rate / 100.0, rest - taxable)
}
result
}
函数tax 似乎有效,但认为Seq[Bracket] 不是定义税级的最佳方式。税级是不相交的“背靠背”区间的排序序列,末尾有一个开区间。您如何定义税级?
【问题讨论】: