Альтернативный логический класс для мотивации того, что scala полностью объектно-ориентирован - PullRequest
0 голосов
/ 03 сентября 2018

В курсе Coursera Мартин Одерский утверждает, что scala полностью объектно-ориентирован, и показывает, что Boolean может быть определен как класс из первых принципов (вместо использования примитивного логического значения 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» в зависимости от метода («T» для «ifThenElse» и «Boolean2» для всех других методов, таких как «&&», ...) , Кроме того, почему он иногда использует реализацию по умолчанию "call by value", а иногда реализацию "call by name" ("=>")? Я знаю разницу между обоими, но почему это полезно здесь?

Заранее спасибо за время и помощь

* Принципы функционального программирования в Scala (неделя 4, лекция 4.1 «Объекты везде»)

Кодовая копия / вставлена ​​с здесь

1 Ответ

0 голосов
/ 03 сентября 2018

T - это тип возвращаемого значения блока then и блока else в функции ifThenElse, это может быть произвольный тип, но он должен совпадать для обоих блоков.

Вызов по имени используется для выполнения только блока ifThenElse, который будет возвращен в зависимости от условия. Если бы вы использовали call-by-value, оба блока были бы оценены до вызова функции ifThenElse. Это не только оптимизация производительности, но с исключениями или без завершения вычислений это также изменит семантику ifThenElse по сравнению со сборкой в ​​if ... then ... else

...