2010-07-19 6 views
6

estoy tratando de utilizar las diversas implementaciones Scala de C# -como retorno rendimiento (es decir, con this one) "para" -constructions como:aplicación Scala de C# -como rendimiento con "para"

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) 
    } 
} 

Pero este código se compila con el error:

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) { 

Como entiendo que tengo que hacer todo el código en el interior para ser el tipo de () => Unit, no de () => Unit @with-annotations. ¿Cómo puedo hacer eso?

Parece que este problema es muy común, pero no encontré ninguna mención en Internet.

+1

Tal vez me falta algo, pero las llaves en ese ejemplo no parecen coincidir. ¿Y cómo puedes llamar generar allí? Está en un ámbito anidado. –

+0

Resolví ambos problemas quitando un soporte adicional. – Blaisorblade

+0

Esta pregunta es un duplicado de lo siguiente, que proporciona una respuesta: http://stackoverflow.com/questions/8934226/continuations-and-for-comprehensions-whats-the-incompatibility –

Respuesta

0

Si está utilizando el tipo iterator del ejemplo vinculado, ¿es posible que su método generate necesite tener el siguiente tipo de devolución en lugar del que tiene allí?

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

Me temo que no tengo mucha experiencia con estas cosas, pero se parece mucho a los métodos que llamas dentro iterator debe tener dos (idénticos) tipo argumentos en la anotación.

+0

http: //www.scala-lang .org/docu/archivos/api/Scala/util/continuaciones/package.html: tipo cps = cpsParam [a, a] Así que creo que el equipo había cambiado el nombre Scala cps a cpsParam y agregó tipo cps Incluso si use @cps [Iteración [Vector [T]], Iteración [Vector [T]]] el problema sigue siendo – sbos

+0

¡Oh, lo siento! Solo estaba trabajando desde lo que vi allí. ¡Buena suerte para que funcione! – Calum

Cuestiones relacionadas