Реализация Seq[T] для CPS-классов
Имея следующий класс, который находится в CPS-контексте (@cps[Unit]), как бы я реализовал Seq-trait? Должен ли я оставить в стороне стандартные черты, такие как Seq, и просто реализовать map, flatmap и foreach в контексте cps?
class DataFlowVariable[T] {
def apply(): T @cps[Unit] = ...
}
class DataFlowStream[T] extends Seq[T] {
override def iterator: Iterator[T] = new Iterator[T] {
private val iter = queue.iterator
def hasNext: Boolean = iter.hasNext
def next: T = { // needed: next: T @cps[Unit] !
val dfvar = iter.next
// dfvar() // not possible as dvar.apply has type "T @cps[Unit]"
}
}
}
1 ответ
Решение
Хорошо, насколько я понял, это похоже на реализацию интерфейсов / черт вроде Seq
это невозможно. Однако, как Scala переписывает for
syntaxic-sugar-loops в обычные вызовы foreach / map-звонки, это прекрасно работает просто для реализации map
а также foreach
с необходимой cps-аннотацией.
filter & co также должен работать.
Однако любой совет о том, как реализовать черты в cps-контексте, очень важен.