6

感谢这篇文章,我开始了解依赖方法类型。我有一个类似于以下的结构

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)
    }
}

我现在想开始使用演员将工作分散到FactoredOut整个集群中。为此,我需要一种方法来传递携带Environment.

显然以下不起作用,但演示了我正在尝试做的事情

object Messages{
    case class EvolvePopulation(env: Environment)(prevPopulation: env.Population)
}

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

(会添加依赖方法类型标签,但我没有足够的积分来添加“新”标签)

4

1 回答 1

6

您需要将依赖类型 ( 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)
于 2012-05-26T10:57:52.953 回答