2015-07-22 4 views
0

Мы с использованием IO монады, которая выглядит следующим образом:Как определить тип вывода функции (типа)?

sealed trait IOCompnent { 

    def writer: AbstractWriter 
    def reader: AbstractReader 

    trait AbstractWriter { 
    def writeFile(parentFolder: String, fileName: String)(f: Writer => Unit): Try[Unit] 
    } 

    trait AbstractReader { 
    def readFile(filePath: String, fileName: String)(f: Reader => String): Try[String] 
    } 
} 

Поскольку мы имеем аналогичный компонент, который использует InputStream/OutputStream, я хотел бы создать общий тип для этого путем извлечения Writer => Unit и Reader => String в тип (потому что результат InputStream равен Array[Byte] вместо String).

Единственная проблема в том, что метод readFile возвращает Try результата функции чтения, так что если я определить функцию readFile следующим образом (только для чтения часть IOComponent), как определить тип Try?

sealed trait ReadComponent[READER] { 

    def reader: AbstractReader 

    trait AbstractReader { 
    def readFile(filePath: String, fileName: String)(f: READER): Try[???] 
    } 
} 
+2

Как насчет 'def readFile [T] (filePath: String, fileName: String) (f: READER): Попробуйте [T]' ? Возможно, у вас может быть сообщение 'READER [T]'? Или f: Reader => T как: 'def readFile (filePath: String, fileName: String) (f: READER => T): Try [T]' – crak

+0

Я бы пошел дальше и сделаю READER общим, но дон 't использовать его на уровне признаков, потому что он изменяется только на уровне def: def readFile [READER [T]] (filePath: String, fileName: String) (f: READER [T]): Попробуйте [T] – Khanser

ответ

0

Мой любимый вариант def readFile[T](filePath: String, fileName: String)(f: READER => T): Try[T]

Пусть F решить от того, является тип выхода.