gpt4 book ai didi

scala - Scala 中的 "Intersection types"

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

我知道 Scala 不支持“联合类型”,但是交集类型呢?

简而言之,我想要一个这样的函数:

def intersect[A,B,C](a: A, b: B): C = ??? // a & b

或者一个方法:

class A {
def intersect[B, C](b: B): C = ??? // this & b
}

AB共享一个公共(public)父类(super class)以确保相交操作的有效性,并且 C将是 A 交集处的类型或 B .

在我的用例中,A 或 B 代表变量或常量(相同类型)。我想按类区分常量和具有单例域的变量。如果我尝试将一个集合与一个值相交,我将返回该值(或者返回空集合/如果该值不在集合中则抛出异常)。

这是预期输出的示例:

trait IntExpression {
// Correct signature to be determined
def intersect [A <: IntExpression, B <: A & this.type] (that: A): B
}
case class IntVariable(domain: Seq[Int]) extends IntExpression
case class IntConstant(value: Int) extends IntExpression

val a = IntVariable(1,2,3)
val b = IntVariable(2,3,4)
val c = IntConstant(2)

然后:

a intersect b == b intersect a == IntVariable(2,3)
a intersect c == c intersect a == IntConstant(2)

最佳答案

正如上面正确说明的 ziggystar:A & B 在 Scala 中是 A with B

关于您想在运行时创建伴随类型 C 的事实,您必须希望在运行时创建此类型,基于您在 A 中获得的类型和B

您可以在 How to mix-in a trait to instance? 找到此问题的解决方案,或者至少是一个线索。 .

但是,您在用例中想要的是 http://en.wikipedia.org/wiki/Dependent_type 的情况.尽管 Scala 不支持依赖类型,但您可以尝试 Agda ;)

关于scala - Scala 中的 "Intersection types",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19429037/

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