2010-07-19 8 views
6

sto cercando di utilizzare varie implementazioni Scala di C# -come rendimento di ritorno (cioè this one) con "per" -constructions quali:implementazione Scala di C# -come resa con "per"

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

Ma questo codice viene compilato con l'errore:

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

come ho capito che devo fare tutto il codice all'interno per essere il tipo di () => Unit, non di () => Unit @with-annotations. Come lo posso fare?

Questo problema sembra essere molto comune, ma non ho trovato alcuna menzione in Internet.

+1

Forse mi manca qualcosa, ma le parentesi su quell'esempio non sembrano corrispondere. E come puoi chiamare generare lì? È in un ambito nidificato. –

+0

Ho risolto entrambi i problemi rimuovendo un rinforzo extra. – Blaisorblade

+0

Questa domanda è una copia di quanto segue, che fornisce una risposta: http://stackoverflow.com/questions/8934226/continuations-and-for-comprehensions-whats-the-incompatibility –

risposta

0

Se si sta utilizzando il tipo iterator dall'esempio collegato, è possibile che il metodo generate abbia il seguente tipo di ritorno anziché quello in uso?

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

ho paura che non ho molta esperienza con questa roba, ma sembra un po 'come i metodi che chiamate all'interno iterator deve avere due (identici) di tipo argomenti sul annotazione.

+0

http: //www.scala-lang .org/docu/files/api/Scala/util/continuazioni/package.html: tipo cps = cpsParam [a, a] Quindi penso squadra Scala aveva rinominato cps a cpsParam e ha aggiunto tipo cps Anche se io usa @cps [Iterazione [Vettore [T]], Iterazione [Vettore [T]]] il problema rimane – sbos

+0

Oh bene, scusa! Stavo solo lavorando da quello che ho visto lì. Buona fortuna per farlo funzionare! – Calum