输入参数化算术?

Lui*_*hys 2 types functional-programming scala parameterized

试着想办法从2小时减去5分钟.

从2中减去5是没有意义的,因为我们最终得到-3个通用时间单位,这是没用的.但如果"小时"是"分钟"的子类型,我们可以将2小时转换为120分钟,并且产生115分钟,或1小时55分钟.

同样地,如果我们想要将5个苹果添加到5个橙子中,我们无法用苹果来评估这个,但可能最终得到10个果实.

在上面的例子中似乎,并且通常当使用数字作为形容词时,整数需要通过它们描述的对象的类型来参数化.我认为如果不是宣布它会非常有用

val hours = 2
val minutes = 5
Run Code Online (Sandbox Code Playgroud)

你可以做点什么

val hours = 2[Hour]
val minutes = 5[Minute]
val result = hours - minutes
assert (result == 115[Minute])
Run Code Online (Sandbox Code Playgroud)

这样的事情是否存在,是否有用,是否可以实施?

编辑:澄清一下,上面的时间例子只是我想到的一个随机例子.我的问题更多的是,参数化数字的概念是否是一个有用的概念,就像你有参数化列表等(答案可能是"不",我不知道!)

Dan*_*mon 6

您可以通过为小时和分钟创建两个类以及从小时到分钟的隐式转换功能来实现此目的

trait TimeUnit
case class Hour(val num: Int) extends TimeUnit      
case class Minute(val num: Int) extends TimeUnit {
  def - (sub: Minute) = Minute(num - sub.num)
}

implicit def hour2Minute(hour: Hour) = Minute(hour.num * 60)
Run Code Online (Sandbox Code Playgroud)

这允许你做类似的事情

val h = Hour(2) - Minute(30) //returns Minute(90)
Run Code Online (Sandbox Code Playgroud)