gpt4 book ai didi

Scala - 如何编译 "delay"表达式

转载 作者:行者123 更新时间:2023-12-04 00:04:56 26 4
gpt4 key购买 nike

我一直想为 Scala 实现一个链式比较运算符,但经过几次尝试后,我认为没有办法做到这一点。这是它应该如何工作:

val a = 3
1 < a < 5 //yields true
3 < a < 5 //yields false

问题是,scala 编译器在计算表达式时非常贪婪,所以上面的表达式计算如下:
1 < a    //yields true
true < 5 //compilation error

我试图编写代码以某种方式实现它,这是我尝试过的:
  • 类型 Int 的隐式转换我的类型 RichComparisonInt - 由于上图的评估方式没有帮助,
  • 覆盖类 Int与我的类(class) - 无法完成,因为 Int两者都是 abstractfinal ,
  • 我试过创建 case class与姓名 < ,就像 :: ,但后来我发现,这个类只是为了模式匹配而创建的,
  • 我想从 => Boolean 创建隐式转换,这将在编译级别工作,但无法提取操作的参数,导致 Boolean结果。

  • 有没有办法在 Scala 中做到这一点?也许宏可以完成这项工作?

    最佳答案

    您将无法命名方法 <不使用宏,因为编译器将始终选择 <实际在 Int 上的方法,而不是任何丰富的类。但如果你能放弃它,你就可以丰富Int正如您所建议的,并返回一个中间类型,用于跟踪迄今为止的比较:

    implicit class RichIntComparison(val x: Int) extends AnyVal {
    def <<<(y: Int) = Comparison(x < y, y)
    }

    case class Comparison(soFar: Boolean, y: Int) {
    def <<<(z: Int) = soFar && (y < z)
    }

    然后我们可以这样做:
    1 <<< 2 <<< 3

    //Equivalent to:
    val rc: Comparison = RichIntComparison(1).<<<(2)
    rc.<<<(3)

    如果需要,您还可以添加来自 Comparison 的隐式转换至 Boolean以便您可以使用 <<<半个比较:
    object Comparison {
    implicit def comparisonToBoolean(c: Comparison): Boolean = c.soFar
    }

    这将允许您执行以下操作:
    val comp1: Boolean = 1 <<< 2 //true
    val comp2: Boolean = 1 <<< 2 <<< 3 //true

    现在一旦你引入了这个隐式转换,你就可以回去制作 <<<Comparison返回 Comparison相反,允许您进行更多扩展链接:
    case class Comparison(soFar: Boolean, y: Int) {
    def <<<(z: Int): Comparison = Comparison(soFar && (y < z), z)
    //You can also use < for everything after the first comparison:
    def <(z: Int) = <<<(z)
    }

    //Now, we can chain:
    val x: Boolean = 1 <<< 2 <<< 3 <<< 4 <<< 3 //false
    val x: Boolean = 1 <<< 2 < 3 < 4 < 7 //true

    关于Scala - 如何编译 "delay"表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29827749/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com