gpt4 book ai didi

Scala类型系统,通过自身类型的参数约束成员的类型

转载 作者:行者123 更新时间:2023-12-01 07:36:12 25 4
gpt4 key购买 nike

不太确定这里的标准术语,所以我将尝试描述我正在尝试做的事情。如果您好奇的话,我实际尝试编写的应用程序是一个类似于 Resque 或 rq 的异步任务队列。

我有一个类型 TaskDef[ArgsT <: AnyVal, ResultT <: AnyVal] .如果你好奇,TaskDef表示“如何执行采用参数类型 ArgsT 和结果类型 ResultT 的异步任务,或者任务背后的代码”。

我正在尝试定义一个类型 TaskInst[DefT <: TaskDef] .如果你好奇,TaskInst表示“一个 TaskDef 和关联的参数来运行它,或者,一个实际的任务实例被提交到队列”。 TaskInst有两个成员,definition: DefTarguments我无法在代码中编写其类型。

在英语中,我想要的约束是:“对于给定的 DefT ,其中 DefT 是一些 TaskDef[ArgsT, ResultT]TaskInst[DefT] 应该包含一个 DefT 和一个 ArgsT ”。也就是说,任务定义的参数类型应该与给任务的参数类型相匹配。

我如何在 Scala 类型系统中表达它?

或者,我是否错误地为我的领域建模并试图做一些不合惯用的事情?一些替代方法会更惯用吗?

提前致谢!

编辑:

我认为我自己编写 Java 的历史在这一点上可能会求助于未经检查的强制转换。这对于一定数量的未经检查的强制转换绝对是可行的,并且只是忽略了 TaskInst 类型之间的约束。的参数与嵌入式 TaskDef 的类型的论据。但是,我确实想知道这是否是编译器可以强制执行的,并且希望没有太可怕的语法。

最佳答案

将它们定义为抽象类型:

trait TaskDef {
type Arguments <: AnyVal
type Result <: AnyVal
}

然后使用类型投影:

trait TaskInst[DefT <: TaskDef] {
def definition: DefT
def arguments: DefT#Arguments
}

Live Demo

关于Scala类型系统,通过自身类型的参数约束成员的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471003/

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