gpt4 book ai didi

scala - 如何通过scala中类型参数的类型成员来约束参数?

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

函数 reduceTo 获取一个类型参数,指示应返回的时间序列的类型,但函数 splitInto 需要一个 Period 值。我想确保它们是连贯的,所以你不能这样做:

reduceTo[MonthlySeries](period=Weekly)  // not ok
reduceTo[MonthlySeries](period=Monthly) // but this is ok
reduceTo[MonthlySeries] // even better, derive the period from the type param

类型参数应该足够了,但我似乎无法从参数化类型中获得我需要的 Period 信息。这是简化的代码:

sealed trait Period
case class Daily extends Period
case class Monthly extends Period


sealed abstract class TimeSeries {
type T
}
case class DailySeries extends TimeSeries {
type T = Daily.type
}
case class MonthlySeries extends TimeSeries {
type T = Monthly.type
}

implicit class DailySeriesOps(lhs: DailySeries) {

def reduceTo[G: TimeSeries](period: Period):G {
// instead of sending the period in, how do I get
// the period value from the type G?
// Or at least constrain the period value?
val s = splitInto(period, lhs)
val reduced : G = ...
// this is ugly
assert(reduced.period == period, s"Reducing to $period but timeseries is ${reduced.period}")
}
}

最初我认为路径依赖类型会有所帮助,比如

def reduceTo[G: TimeSeries](period: G.T)

但据我所知,这需要 Daily 是在 DailySeries 中定义的一个类,因为它在其他上下文中使用并不理想。

另一个行不通的想法是不发送周期参数,而是从 G 中获取值,但由于它的实例尚不存在,因此行不通

def reduceTo... = {
val period = G.T
...
}

[更新]

也试过

def reduceTo[G : TimeSeries](period: TimeSeries#T: G = {
val ts = reduce[F](period.asInstanceOf[GroupedPeriod], lhs)

但是随后由于 reduceTo 调用的类型不匹配而无法编译:

type mismatch;
[error] found : com.example.metrics.Periods.Monthly.type
[error] required: com.example.metrics.calculations.TimeSeries#T

有什么想法吗?

最佳答案

根据您的评论,如果 GroupedSeries 有 type T 字段,您可以使用 period: G#T,否则您需要添加额外的通用参数和使用类似的东西:

  def reduceTo[G <: GroupedSeries[_], T <: TimeSeries](period: T#T): G = {
//Your code
}

我的编译器说:

DailySeriesOps().reduceTo[DailySeries,DailySeries](Monthly) // I don't compile that
DailySeriesOps().reduceTo[DailySeries,DailySeries](Daily) // that i will
DailySeriesOps().reduceTo[MonthlySeries,MonthlySeries](Monthly) // that i will too
DailySeriesOps().reduceTo[MonthlySeries,MonthlySeries](Daily) // and not this one

但是你的问题不容易复现,不知道能不能回答你的问题,希望对你有帮助

关于scala - 如何通过scala中类型参数的类型成员来约束参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628225/

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