2012-09-27 90 views
0

我有問題了解如何把類型信息放在scala中,以及如何把它。在這裏,我創建了幾個Actor的序列,我不會輸入它們。即使我不得不,我不知道哪種類型的序列map產生給他們適當的類型。需要一些幫助,以幫助類型推理引擎

然後,當編譯器因爲我試圖總結Any s而大叫我時,我不知道從哪裏開始填補空白。

這是我的代碼,我試圖儘量減少它,同時仍然讓所需的信息可用。

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

我也很欣賞一些關於此問題的綜合性文檔的一些好的指針。

+0

哪一行是編譯錯誤?你可能需要提供類型信息到's的輸出!使用mapTo轉換工作(數組)。一些文件在這裏:http://doc.akka.io/docs/akka/snapshot/scala/actors.html#ask-send-and-receive-future – rjsvaljean

+0

摺疊,它不知道哪些類型是論據我反饋給'(_ + _)'。我和斯卡拉演員合作,而不是阿卡,不知道它是否重要 – m09

回答

2

在演員之間傳遞的對象不是鍵入的,演員必須自己過濾對象 - 就像您在Slave演員中已經做的那樣。正如你所看到的,!!定義爲

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

所以在返回Future任何類型的信息。也許最簡單的解決方法是用

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

這種過濾掉那些只是結果SomeInt類型來代替行var res2 ..