gpt4 book ai didi

scala - 依赖方法类型的消息等效项

转载 作者:行者123 更新时间:2023-12-04 15:02:11 25 4
gpt4 key购买 nike

感谢 this帖子我开始了解依赖方法类型。我有一个类似于以下的结构

trait Environment{
type Population <: PopulationBase
protected trait PopulationBase

def evolveUs(population: Population): Population
}

object FactoredOut{
def evolvePopulation(env: Environment)(prevPopulation: env.Population): env.Population = {
env.evolveUs(prevPopulation)
}
}

我现在想开始使用 Actor 在 FactoredOut中传播作品跨集群的一部分。为此,我需要一种方法来传递带有 Environment 的不可变消息。 .

显然以下不起作用,但演示了我正在尝试做的事情
object Messages{
case class EvolvePopulation(env: Environment)(prevPopulation: env.Population)
}

传递人口及其周围环境的正确方法是什么?

(本来可以添加dependent-method-types 标签,但我没有足够的点数来添加"new"标签)

最佳答案

您需要将依赖类型的值 ( env.Population ) 和类型依赖的值 ( env ) 打包为单个对象的直觉是完全正确的。

鉴于您已经发布的定义,最简单的方法可能是这样的,

// Type representing the packaging up of an environment and a population
// from that environment
abstract class EvolvePopulation {
type E <: Environment
val env : E
val prevPopulation : env.Population
}

object EvolvePopulation {
def apply(env0 : Environment)(prevPopulation0 : env0.Population) =
new EvolvePopulation {
type E = env0.type
val env : E = env0 // type annotation required to prevent widening from
// the singleton type
val prevPopulation = prevPopulation0
}
}

现在如果我们定义一个具体的环境类型,
class ConcreteEnvironment extends Environment {
class Population extends PopulationBase
def evolveUs(population: Population): Population = population
}

我们可以像以前一样直接使用它,
val e1 = new ConcreteEnvironment

val p1 = new e1.Population
val p2 = e1.evolveUs(p1)
val p3 = e1.evolveUs(p2)

我们也可以打包一个环境和人口进行分发,
def distrib(ep : EvolvePopulation) {
import ep._
val p4 = env.evolveUs(prevPopulation)
val p5 = env.evolveUs(p4)
val p6 = env.evolveUs(p5)
}

val ep1 = EvolvePopulation(e1)(p3)

distrib(ep1)

关于scala - 依赖方法类型的消息等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10765015/

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