gpt4 book ai didi

scala - 如何定义扩展此特征的任何内容

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

请引用以下代码片段:

 trait Fruit {
val color:String
def == (fruit:Fruit) = this.color == fruit.color
}

case class Orange(color:String) extends Fruit

case class Apple(color:String) extends Fruit

正如预期的那样, Orange("red") == Orange("red")true 。但是,我想强制只能比较相同类型的水果,因此例如 Orange("red") == Apple("red") 应该给出错误。我们能否以优雅的方式在 trait == 中的 Fruit 签名中强制执行这一点?

编辑:我希望在编译时捕获错误,而不是在运行时。

最佳答案

Scalaz 有一个 Equal “类型类”可以解决这个问题,尽管使用了不同的运算符。

https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/Equal.scala

它的核心基本上是这个(虽然我在他们使用一些 unicode 的地方使用 === )

/** Defines a type safe === operator */
trait Equals[A] {
def ===(y : A) : Boolean
}

/** A conventient way to define Equals traits based on the == operator */
def equalA[A](x : A) = new Equals[A] {
def ===(y : A) = x == y
}

并且像这样使用
// one for oranges
implicit val EqualsOrange = equalA[Orange] _

// one for apples
implicit val EqualsApple = equalA[Apple] _


Orange("red") === Orange("red") // true

Orange("red") === Orange("green") // false

Orange("red") === Apple("red") // Compile error

关于scala - 如何定义扩展此特征的任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5239369/

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