替代布尔类,以激励scala完全面向对象

时间:2018-09-03 09:31:27

标签: scala boolean

在Coursera课程*中,马丁·奥德斯基(Martin Odersky)认为scala完全是面向对象的,并表明可以将布尔定义为从第一原理开始的类(而不是使用JVM的原始布尔)。

他定义了以下布尔类:

package week4

abstract class Boolean2 {

  def ifThenElse[T](t: => T, e: => T): T

  def && (x: => Boolean2): Boolean2 = ifThenElse(x, False) 
  def || (x: => Boolean2): Boolean2 = ifThenElse(True, x) 
  def unary_! : Boolean2 = ifThenElse(False, True)

  def == (x: Boolean2): Boolean2 = ifThenElse(x, x.unary_!) 
  def != (x: Boolean2): Boolean2 = ifThenElse(x.unary_!, x)

  def < (x: Boolean2): Boolean2 = ifThenElse(False, x)
}

object True extends Boolean2 {
  def ifThenElse[T](t: => T, e: => T) = t
}
object False extends Boolean2 {
  def ifThenElse[T](t: => T, e: => T) = e
}

我想知道为什么他有时会根据方法使用类型“ T”,有时会键入“ Boolean2”(对于“ ifThenElse”为“ T”,对于所有其他方法,如“ &&”,则为“ Boolean2”,...) 。此外,为什么他有时使用默认的“按值调用”实现,而有时使用“按名称调用”(“ =>”)实现?我知道两者之间的区别,但是为什么在这里有用?

提前感谢您的时间和帮助

* Scala中的函数式编程原理(第4周,第4.1讲,对象无处不在)

here复制/粘贴代码

1 个答案:

答案 0 :(得分:3)

TifThenElse函数中then块和else块的返回类型,它可以是任意类型,但必须与两个块都匹配。

根据名称调用仅用于执行ifThenElse块,该块将根据条件返回。 如果您要使用按值调用,则将在调用ifThenElse函数之前对两个块进行评估。与ifThenElse中的构建相比,这不仅是性能优化,而且在例外情况或不终止计算的情况下,还将改变if ... then ... else的语义。