2010-07-19 6 views
6

Je suis en train d'utiliser différentes implémentations Scala de rendement de rendement C# -comme (c.-à-this one) avec « pour » -Constructions tels que:mise en œuvre Scala de rendement C# -comme avec « pour »

private def permutations[T](s: Vector[T]) = { 
    def swap(i: Int, j: Int) { 
    val tmp = s(i) 
    s.set(i, s.get(j)) 
    s.set(j, tmp) 
    } 

    iterator[Vector[T]] { 
    def generate(left: Int, right: Int): Unit @cps[Iteration[Vector[T]]] = { 
     if (left >= right) 
     yieldValue(s) 

     else { 
     generate(left, right) 
     for (i <- left to right) { 
      swap(left, i) 
      generate(left+1, right) 
      swap(left, i) 
     } 
     } 
    } 

    generate(0, s.size-1) 
    } 
} 

Mais ce code se compile avec l'erreur:

error: no type parameters for method foreach: (f: (Int) => U)Unit exist so that it can be applied to arguments ((Int) => Unit @util.continuations.package.cps[ru.ispras.texterra.nlp.GHMMDisambiguator.Iteration[Vector[T]]]) 
--- because --- 
argument expression's type is not compatible with formal parameter type; 
found : (Int) => Unit @util.continuations.package.cps[ru.ispras.texterra.nlp.GHMMDisambiguator.Iteration[Vector[T]]] 
required: (Int) => ?U 
for (i <- left to right) { 

Comme je comprends que je dois faire tout le code à l'intérieur pour être le type de () => Unit, pas de () => Unit @with-annotations. Comment puis je faire ça?

Ce problème semble être très commun, mais je n'ai trouvé aucune mention dans Internet.

+1

Peut-être qu'il me manque quelque chose, mais les accolades sur cet exemple ne semblent pas correspondre. Et comment pouvez-vous appeler générer là? C'est dans une portée imbriquée. –

+0

J'ai résolu les deux problèmes en enlevant une attelle supplémentaire. – Blaisorblade

+0

Cette question est une copie de ce qui suit, qui fournit une réponse: http://stackoverflow.com/questions/8934226/continuations-and-for-comprehensions-whats-the-incompatibility –

Répondre

0

Si vous utilisez le type iterator à partir de l'exemple lié, est-il possible que votre méthode generate nécessite le type de retour suivant plutôt que celui que vous avez ici?

Unit @cps[Iteration[Vector[T]],Iteration[Vector[T]]] 

Je crains que je n'ai pas beaucoup d'expérience avec ce genre de choses, mais il ressemble beaucoup les méthodes que vous appelez à l'intérieur iterator doit avoir deux (identiques) de type arguments sur l'annotation.

+0

http: //www.scala-lang .org/docu/fichiers/api/scala/util/continuations/package.html: Type cps = cpsParam [A, A] Je pense que l'équipe de scala avait renommé cps à cpsParam et le type ajouté cps Même si je utilisez @cps [Iteration [Vecteur [T]], Itération [Vecteur [T]]] le problème reste – sbos

+0

Oh bien, désolé! Je travaillais juste à partir de ce que j'ai vu là-bas. Bonne chance pour le faire fonctionner! – Calum