2012-05-26 9 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)に依存する値は1つのオブジェクトとして正確です。我々は

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