我目前正在玩斯卡拉斯無阻塞期貨又名。承諾。我努力使下面的函數尾遞歸:尾遞歸和斯卡拉承諾
@tailrec
private def repeat(res: Promise[I]):Promise[I] =
res map p flatMap {
(b:Boolean) =>
if(b) repeat(res flatMap f) else res
}
其中p
是I=>Boolean
型和f
謂詞是 型I=>Promise[I]
併發功能。
該方法在沒有註釋的情況下編譯。
任何提示?謝謝
感謝您的回答。但是你有沒有想過我可以如何解決這個問題而不被阻塞? – paradigmatic 2011-05-09 15:09:18
對不起,但我不熟悉scalaz。我試圖找出代碼中的'p'調用是失敗的。你能想到你的代碼使用while循環的程序版本嗎?如果這是不可能的,那就不可能有tco。 – ziggystar 2011-05-09 15:49:49
「,您的集合中的每個元素都有一個,至少這是編譯器看到的。」是不正確的,恕我直言:'Promise'不是一個集合,編譯器只看到一個調用(不在尾部位置)。然而,第二段既正確又足以解釋爲什麼這不是尾遞歸。 – 2011-05-09 19:04:40