Je joue actuellement avec des contrats à terme non bloquants de Scalaz. Promesses. Je me bats pour faire la queue récursif de fonction suivante:Promesses de rançon-récursivité et de scala
@tailrec
private def repeat(res: Promise[I]):Promise[I] =
res map p flatMap {
(b:Boolean) =>
if(b) repeat(res flatMap f) else res
}
où p
est un prédicat de type I=>Boolean
et f
est une fonction concurrente avec de type I=>Promise[I]
.
La méthode se compile sans l'annotation.
Des indices? Merci
Merci pour cette réponse. Mais avez-vous une idée de comment je peux résoudre cela sans bloquer? – paradigmatic
Je suis désolé mais je ne suis pas familier avec scalaz. J'ai juste essayé de savoir ce que l'appel 'p' dans votre code est et a échoué. Pouvez-vous penser à une version procédurale de votre code qui utilise une boucle while? Si ce n'est pas possible, il ne peut pas y avoir de tco. – ziggystar
"un pour chaque élément de votre collection, c'est du moins ce que voit le compilateur." est incorrect, IMHO: 'Promise' n'est pas une collection et le compilateur ne voit qu'un appel (pas en position de queue). Cependant, le deuxième paragraphe est à la fois correct et suffisant pour expliquer pourquoi ce n'est pas récursif de la queue. –