2015-11-06 5 views
0

Я хочу запустить DriverTest, но тип Process.count [I] изменяется на [Nothing] ... В чем проблема с этим кодом?Неверный тип вывода [Nothing]

Сообщение об ошибке выглядит так: "найдено: Процесс [Ничего, Int], требуется: Process [String, Int]"

enter image description here

sealed trait Process[I, O] 
case class Halt[I, O]() extends Process[I, O] 
case class Await[I, O](program: Option[I] => Process[I, O]) extends Process[I, O] 
case class Emit[I, O](output: O, process: Process[I, O] = Halt[I, O]) extends Process[I, O] 

object Driver { 

    @annotation.tailrec 
    def driver[I, O](process: Process[I, O], is: Stream[I], os: Stream[O] = Stream()): Stream[O] = process match { 
    case Halt() => os.reverse //State: Halt -> stop driver 
    case Await(program) => is match { 
     case h #:: t => driver(program(Some(h)), t, os) //State: Await + Data: remain -> loop driver 
     case empty => driver(program(None), empty, os) //State: Await + Data: empty -> go to Halt 
    } 
    case Emit(o, process) => driver(process, is, o #:: os) //State: Emit -> save data + loop driver 
    } 
} 

object Process { 

    def loop[I, O, S](s1: S)(f: (I, S) => (O, S)): Process[I, O] = Await[I, O] { 
    case Some(i) => { 
     val (o, s2) = f(i, s1) 
     Emit(o, loop(s2)(f)) 
    } 
    case None => Halt() 
    } 

    def count[I]: Process[I, Int] = loop(0)((i: I, s: Int) => (s + 1, s + 1)) 
} 

object DriverTest extends App { 
    val input = Stream("a","b","c") 
    val proc = Process.count 
    val output = Driver.driver(proc, input) 
} 

ответ

3

Следующая линия предполагают, чтобы помочь.

val proc = Process.count[String] 
+0

Это работает, но это довольно аккуратно добавив [String] или что-то в отдельном случае. Разве нет более общего решения без такого тега типа? – Curycu

+0

'val proc = Process.count [Any]' может избавиться от аккуратных вещей ... но ... – Curycu

+3

Нет информации для метода count, откуда взять 'type' from. Вот почему у вас есть «Ничего». Если вы хотите предотвратить это, вы должны помочь использовать тип вывода scala. Вы можете сделать это для ex. путем ввода 'input' в качестве параметра метода' count'. – Rumoku

Смежные вопросы