【问题标题】:Alternative Boolean class to motivate that scala is fully object oriented用于激励 scala 完全面向对象的替代布尔类
【发布时间】: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 还是打印both True False?什么时候评估普通方法参数? Scala 是懒惰还是渴望,是严格还是非严格?
  • 提示 #B.1:list.head evaluatedlist.isEmpty || list.head == 0 中的空列表吗?
  • 这样在 cmets 中放入提示真的合适吗?为什么不简单地回答这个问题?

标签: scala boolean


【解决方案1】:

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

按名称调用仅用于执行将根据条件返回的ifThenElse 块。 如果您使用按值调用,则将在调用 ifThenElse 函数之前评估两个块。这不仅是一种性能优化,而且与 if ... then ... else 中的构建相比,它还会改变 ifThenElse 的语义,但存在异常或不终止计算。

【讨论】:

  • 谢谢,很好的解释。是不是意味着对于“
  • @user3577165 比较运算符应始终在进行比较之前评估这两个表达式,即使在仅评估其中一个之后结果是已知的。它们不是short-cut 运算符,如||&amp;&amp;
猜你喜欢
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 2015-08-01
  • 1970-01-01
  • 2012-05-24
  • 2022-12-30
  • 1970-01-01
相关资源
最近更新 更多