一些帮助需要帮助类型推断引擎

时间:2012-09-27 21:35:17

标签: scala types

我很难理解在scala中放置类型信息的位置,以及如何放置它。在这里,我创建了几个Actor s的序列,我没有输入它们。即使我不得不这样做,我也不知道哪种类型的序列map会产生适当的类型。

然后当编译器对我大吼大叫,因为我试图总结Any时,我不知道从哪里开始填补空白。

这是我的代码,我试图尽量减少它,同时仍然提供必要的信息。

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)(_+_))
            }
        }
    }
}

我也很欣赏有关这个问题的全面文件的一些好的指示。

1 个答案:

答案 0 :(得分:2)

在actor之间传递的对象不是键入的,actor必须自己过滤对象 - 正如您在Slave actor中所做的那样。如您所见,!!被定义为

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

因此返回的Future中没有类型信息。可能最简单的解决方案是用

替换行var res2 ..
val res2 = results collect {case Some(y:Int) => y}

这会过滤掉Some类型的Int结果。