Недавно я попробовал вариант некоторых упражнений по параллелизму в Функциональное программирование в Scala (отличная книга, кстати. ., а издание с ранним доступом можно загрузить бесплатно!). Глава 7 посвящена созданию конструктора монадического типа Par[X], который позволяет разветвлять любое выражение типа X и запускать его параллельно в паре с ExectutorService
Моя попытка состояла в том, чтобы создать API, который позволял бы вызывающим сторонам отображать параллельные выражения (экземпляры параметризованного типа Par[X]) вместе. Я хотел что-то похожее на Option/Some/None, в котором, если один из результатов плоской карты в цепочке оказывается сбоем («Нет» в случае Option), то этот сбой, который «пузырится» до top, так что вызывающей стороне, создавшей цепочку, нужно только проверить, что возвращаемое значение верхнего уровня не является индикатором ошибки. (Надеюсь, то, что я хочу сделать, ясно из этого объяснения). В любом случае... Я столкнулся с проблемой построения индикатора ошибок.
Я попытался построить его двумя способами: как объект case и как класс case. В первом случае, объект case, я получил эту ошибку
Object creation impossible since member get():V in java.util.concurrent.future is not defined.
Вот мой код для первого случая:
case object Failure extends Future[Nothing] {
def isDone = true
// why is compiler telling me i'm not defining this, when def'n is below?
def get(timeout: Long, units: TimeUnit) =
throw new NoSuchElementException("nothing to get from failure")
def isCancelled = false
def cancel(evenIfRunning: Boolean): Boolean = false
}
Затем я попытался использовать класс case, расширенный из Future[Nothing], например:
case class Failure2 extends Future[Nothing] {
def isDone = true
def get(timeout: Long, units: TimeUnit) = throw new NoSuchElementException("nothing to get from failure")
def isCancelled = false
def cancel(evenIfRunning: Boolean): Boolean = false
}
Это привело к следующей ошибке:
class Failure2 must be declared abstract or implement abstract member get():V in java.util.concurrent.future
Если кто-то из вас, опытных разработчиков Scala API, может помочь найти решение, я был бы очень признателен!