2012-05-26 4 views
6

this 게시 덕분에 종속 형 메서드 유형에 대한 내 머리가 바뀌고 있습니다. 나는 이제 클러스터에 걸쳐 FactoredOut 부분에 작업을 분산하는 배우를 사용하여 시작하려는의존형 메서드 유형에 해당하는 메시지

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

다음과 같은 구조를 가지고있다. 이렇게하려면 Environment을 포함하는 불변 메시지를 전달하는 방법이 필요합니다.

작동하지 않습니다 다음 분명히

하지만 내가

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

인구를 전달하는 올바른 방법은 무엇을 할 노력하고있어 및 그 주변 환경을 둘러싸는 무엇을 보여?

은 (종속-방법-종류의 태그를 추가 한 것이지만, 나는 '새로운'태그를 추가 포인트가 부족하지 않습니다)

답변

6
당신이 종속의 두 값을 포장 할 필요가

당신의 직관 유형 (env.Population)이고 유형이 (env)에 의존하는 값은 단일 객체로서 정확합니다. 우리는 구체적인 환경 유형을 정의하는 경우

class ConcreteEnvironment extends Environment { 
    class Population extends PopulationBase 
    def evolveUs(population: Population): Population = population 
} 

우리가 그것을 사용할 수 있습니다, 지금 아마 가장 간단한 방법이 같은 것,

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

을 이미 게시 한 정의를 감안할 때 전과 같이 직접

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) 
+0

환상적입니다. 귀하의 코스에서 타입 시스템이 깊숙이 다이빙되지 않았다면, 이것을 전혀 따르지 않았을 것입니다. – Pengin

관련 문제