gpt4 book ai didi

scala - 在 Scala 中保持方法之间的类型信息

转载 作者:行者123 更新时间:2023-12-02 04:50:45 24 4
gpt4 key购买 nike

这是我的问题:如果某些谓词适用,我有一大堆对象,我想在这些对象上应用过程(我称之为“编译器”)。为清楚起见,我想将谓词函数与过程分开;然而,在许多情况下,谓词可能非常复杂,并且构建了我想在后面的过程函数中重用的信息。

我定义一个编译器如下:

trait Compiler[A] {
def mtch(o: SourceObject): Option[A]
def proceed(o: SourceObject, data: A): Unit
}

以及如何调用编译器:

val compilers: Seq[Compiler[_]]
val objects: Seq[SourceObject]

for (o <- objects; c <- compilers; data <- c.mtch(o)) {
c.proceed(o, data)
}

也就是说,如果mtch函数返回Some(data),那么调用proceed方法,用data附上。但是,我无法编译它,因为我在管理编译器时不知道数据的类型。

此外,我也有一些实际不需要任何数据的情况。在我目前的状态下,我让匹配器返回 Some(null),这很糟糕。

最佳答案

改为使用依赖于路径的类型。替换

trait Compiler[A] {
def mtch(o: SourceObject): Option[A]
def proceed(o: SourceObject, data: A): Unit
}

trait Compiler {
type A
def mtch(o: SourceObject): Option[A]
def proceed(o: SourceObject, data: A): Unit
}

一切都会正常进行。

这里的技巧是你的 for-comprehension 中 data 的类型变成了 c.A,这是 c.proceed 期望的类型它的第二个参数。

至于null,让编译器不需要传递参数type A = Unit,所以你返回Some(()) 如果它应该继续。

关于scala - 在 Scala 中保持方法之间的类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18899155/

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