0

我无法理解在 scala 中将类型信息放在何处以及如何放置。在这里,我创建了几个Actors 序列,但我不输入它们。即使我必须这样做,我也不知道会map产生哪种类型的序列来为它们提供正确的类型。

然后当编译器因为我试图 sum Anys 而对我大喊大叫时,我不知道从哪里开始填补空白。

这是我的代码,我尝试将其最小化,同时仍然提供必要的信息。

object Actors {
    def main(args: Array[String]) {
        val array = randomArray(5)
        val master = new Master(array, 5)
        master.start
    }

    def randomArray(length: Int): Array[Int] = {
        val generator = new Random
        new Array[Int](length) map((_:Int) => generator nextInt)
    }
}

class Master(array: Array[Int], slavesNumber: Int) extends Actor {
    def act () {
        val slaves = (1 to slavesNumber).map(_ => new Slave)
        slaves.foreach(s => s.start)
        val futures = slaves.map(s => s !! Work(array))
        val results = awaitAll(3000, futures:_*)
        val res2 = results.flatMap(x => x)
        println((0 /: res2)(_+_))
    }
}

class Slave() extends Actor {
    def act () {
        Actor.loop {
            receive {
                case Work(slice) =>
                    reply((slice :\ 0)(_+_))
            }
        }
    }
}

我也很感激关于这个问题的全面文档的一些好的指示。

4

1 回答 1

2

在演员之间传递的对象没有类型,演员必须自己过滤对象——就像你在Slave演员中所做的那样。如您所见,!!定义为

def !!(msg: Any): Future[Any]

所以返回的没有类型信息Future。可能最简单的解决方案是var res2 ..

val res2 = results collect {case Some(y:Int) => y}

这会过滤掉那些Some类型为 的结果Int

于 2012-09-28T12:12:05.640 回答