【发布时间】:2018-09-03 09:31:26
【问题描述】:
在 coursera 课程* 中,Martin Odersky 认为 scala 是完全面向对象的,并表明 Boolean 可以根据第一原理定义为一个类(而不是使用 JVM 的原始 Boolean)。
他将替代布尔类定义如下:
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”,具体取决于方法(“T”代表“ifThenElse”,“Boolean2”代表所有其他方法,如“&&”,...) .此外,为什么他有时使用默认的“按值调用”实现,有时使用“按名称调用”(“=>”)实现?我知道两者之间的区别,但为什么它在这里有用?
提前感谢您的时间和帮助
*Scala 中的函数式编程原理(第 4 周,第 4.1 讲无处不在的对象)
从here复制/粘贴代码
【问题讨论】:
-
一些提示:
if (true) 1 else 2在 Scala 中返回什么?它返回Boolean还是Int?那么,Boolean2.ifThenElse应该返回什么?Boolean2还是别的什么?还有什么? -
提示 #2:
if (true) println("True") else println("False")在 Scala 中打印什么?它是打印True还是打印bothTrue和False?什么时候评估普通方法参数? Scala 是懒惰还是渴望,是严格还是非严格? -
提示 #B.1:
list.headevaluated 是list.isEmpty || list.head == 0中的空列表吗? -
这样在 cmets 中放入提示真的合适吗?为什么不简单地回答这个问题?