【问题标题】:Implementing implication logical operator in scala在scala中实现隐含逻辑运算符
【发布时间】:2012-04-20 16:09:27
【问题描述】:

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

a implies b

翻译成:

!a || b

其中ab 是一些计算结果为Boolean 的表达式。

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

  implicit def extendedBoolean(a : Boolean) = new {
    def implies(b : Boolean) = {
      !a || b
    }
  }

因为无论a 的值如何,它都会评估ab。只有当a 为真时,正确的解决方案才会评估b

【问题讨论】:

    标签: scala operators


    【解决方案1】:

    您想使用按名称调用的参数,我相信以下就足够了:

    implicit def extendedBoolean(a : Boolean) = new {
        def implies(b : => Boolean) = {
          !a || b
        }
      }
    

    解释:

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

    由于您提供的类型签名=> Boolean,编译器知道它可以进行这种转换。这个post 解释得更详细,但仅它的标题就很好地概括了正在发生的事情:"Automatic Type-Dependent Closure Construction"

    Scala 的这一特性使人们能够编写控制结构,也许就像使用其他语言的宏来编写它们一样容易。观察他们使用两个按名称调用的参数重新实现 while 循环的难易程度:一个用于条件,一个用于主体。

    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
      }
    }
    

    【讨论】:

    • 你所说的 nullary function 在 Scala 中被称为 call-by-name argument
    • 是的。正如我链接到的 Scala 网站上的页面所解释的那样,“所谓的 call-by-name 评估”是在 Scala 中通过将表达式自动转换为空函数来实现的。我认为描述如何 Scala 实现语言功能比仅仅说明如何使用按名称调用更有趣和更有教育意义。
    【解决方案2】:

    您想让b 成为必须评估的函数。这样,只有在实际访问时才会对其进行评估。

    您可以通过将其类型更改为 => Boolean 来做到这一点,这意味着无需任何输入即可评估为 Boolean

    implicit def extendedBoolean(a: Boolean) = new {
      def implies(b: => Boolean) = {
        !a || b
      }
    }
    

    使用方法如下:

    scala> true implies { println("evaluated"); true }
    evaluated
    res0: Boolean = true
    
    scala> false implies { println("evaluated"); true }
    res1: Boolean = true
    

    请注意,当atrue 时,b 被评估(打印“评估”)。但是当afalse 时,它不会被评估(不打印)。

    【讨论】:

      猜你喜欢
      • 2013-04-30
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多