在scala中实现implication逻辑运算符

fik*_*nik 4 scala operators

我想知道是否有可能在scala中实现逻辑含义.例如:

a implies b
Run Code Online (Sandbox Code Playgroud)

翻译成:

!a || b
Run Code Online (Sandbox Code Playgroud)

在哪里ab是一些评估的表达式Boolean.

我最初开始跟随,但这是一个错误的方法

  implicit def extendedBoolean(a : Boolean) = new {
    def implies(b : Boolean) = {
      !a || b
    }
  }
Run Code Online (Sandbox Code Playgroud)

因为它将评估两者a并且b无论其价值如何a.正确的解决方案只会评估b何时a为真.

ell*_*ben 7

你想使用call-by-name参数,我相信以下内容应该足够了:

implicit def extendedBoolean(a : Boolean) = new {
    def implies(b : => Boolean) = {
      !a || b
    }
  }
Run Code Online (Sandbox Code Playgroud)

说明:

你必须传递一些值,b但你不希望评估该表达式; Scala可以自动将表达式转换为不带参数的函数,并计算表达式.implies然后,如果需要,您的运算符将评估该nullary(零参数)函数.

由于您提供的类型签名,编译器知道它可以执行此转换=> Boolean.这篇文章更详细地解释了,但它的标题仅仅是对正在发生的事情的一个非常好的解释:"自动类型依赖关闭构造".

Scala的这个特性使得人们可以编写控件结构,可能就像使用其他语言的宏编写它们一样容易.观察它们使用两个按名称调用参数重新实现while循环的容易程度:一个用于条件参数,一个用于body.

object TargetTest2 extends Application {
  //type signature not too terribly mysterious
  def whileLoop(cond: => Boolean)(body: => Unit): Unit =
    if (cond) {
      body
      whileLoop(cond)(body)
    }

  //about as easy to use as a plain-old while() loop
  var i = 10
  whileLoop (i > 0) {
    println(i)
    i -= 1
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 你所谓的*nullary function*在Scala中被称为*call-by-name参数*. (2认同)