2012-05-26 19 views
6

Nhờ có this bài đăng Tôi nhận được đầu về các loại phương thức phụ thuộc. Tôi có cấu trúc tương tự như sauTin nhắn tương đương với các loại phương thức phụ thuộc

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

Tôi bây giờ muốn bắt đầu sử dụng diễn viên để truyền bá tác phẩm trong phần FactoredOut trên một cụm. Để thực hiện điều này, tôi cần một cách để truyền các thông điệp không thay đổi được mang theo Environment.

Rõ ràng sau không làm việc, nhưng chứng minh những gì tôi đang cố gắng để làm

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

cách chính xác để vượt qua dân số là gì và nó kèm theo môi trường xung quanh?

(Sẽ có thêm thẻ phụ thuộc phương pháp-loại, nhưng tôi không có đủ điểm để thêm một thẻ 'mới')

Trả lời

6

trực giác của bạn mà bạn cần để đóng gói lên cả giá trị của người phụ thuộc loại (env.Population) và giá trị mà loại phụ thuộc vào (env) là một đối tượng duy nhất là chính xác.

Với các định nghĩa bạn đã đăng, có lẽ là phương pháp đơn giản nhất sẽ là một cái gì đó như thế này,

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

Bây giờ nếu chúng ta định nghĩa một loại môi trường bê tông,

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

chúng ta có thể sử dụng nó trực tiếp như trước,

val e1 = new ConcreteEnvironment 

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

và chúng tôi cũng có thể gói lên một môi trường và dân số để phân phối,

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

Tuyệt vời, bao giờ hết. Sẽ không có được sau này ở tất cả nếu nó đã không được cho hệ thống loại sâu lặn vào khóa học của bạn. – Pengin