scala - Scala中的简单税收计算
问题描述
假设我正在编写一个具有两个功能的玩具税计算器:
// 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%
收入最高 tp10
Bracket(Some(BigDecimal(20)), BigDecimal(20))
的税级 指收入最高的税级20%
tp20
Bracket(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]
不是定义税级的最佳方式。税级是不相交的“背靠背”区间的排序序列,末尾有一个开区间。您如何定义税级?
解决方案
我建议List[Tuple[Double, Double]]
与原始形式大致相同。
元组在语义上的位置(lower_bound, tax_rate_in_range)
。关键区别在于行为的基本单位是税收表,而不是单个括号。在此核心数据定义的计划内,如果数字括号变大,您可以添加优化,并且您可以为简单的解决方案保留重要的不变量,例如保持列表按lower_bound
.
推荐阅读
- sql - 为什么代码“ORDER BY rating DESC”会导致我的代码出错?
- r - R 表产生意想不到的结果
- javascript - 有没有办法让函数记住以前的结果?
- unity3d - 如何统一向多维数据集添加文本
- google-cloud-firestore - 有没有办法强制 Firestore 文档包含真实的元数据?
- linear-regression - 在 lmer 中解释两个交互项的影响的正确方法是什么?
- php - 作曲家无法在作曲家安装时删除文件
- mongodb - 使用 MongoDB Sink Connector 通过不同的主键更新现有文档
- java - 使用正则表达式从文本映射 TY_111.22-L007-C010
- html - HTML 选择不会在 chrome 上居中文本