Вот перевод текста на русский язык:
Является ли какой-либо здравомыслящий разработчик способным сказать, какие catchers получат исключения?
Существует слишком много концепций об исключениях при работе с scala.concurrent.Future
. Вы должны помнить о различных стратегиях обработки исключений между flatMap
, recover
, recoverWith
и onFailure
, а также о разнице между scala.concurrent.Future.failed(new Exception)
и scala.concurrent.future { throw new Exception }
.
scala.async
не делает ситуацию лучше, потому что scala.async
будет выдавать ошибки компилятора для каждого await
в операторах try
.
К счастью, вы можете избавиться от всех этих концепций, если переключитесь на stateless-future
. В stateless Futures
нет неявного параметра catcher
ни в flatMap
, ни в map
, ни метода onFailure
или recover
вообще. Вы просто пытаетесь, и всё делается. Смотрите примеры, чтобы узнать это.
Оптимизация хвостового вызова является важной функцией для чистого функционального программирования. Без оптимизации хвостового вызова многие рекурсивные алгоритмы потерпят неудачу во время выполнения, и вы получите хорошо известную ошибку StackOverflowError
.
Язык Scala предоставляет scala.annotation.tailrec
для автоматической оптимизации простых хвостовых рекурсий и scala.util.control.TailCalls
для ручной оптимизации сложных хвостовых вызовов.
Проект stateless-future
внутренне основан на scala.util.control.TailCalls
и автоматически выполняет оптимизацию хвостового вызова в магических блоках Future
, без какого-либо дополнительного специального синтаксиса.
Смотрите этот пример. Он просто работает, и никаких ошибок StackOverflowError
или OutOfMemoryError
не возникает. Обратите внимание, что если вы перенесёте этот пример на scala.async
, он вызовет OutOfMemoryError
или TimeoutException
.
Для Scala существовал плагин продолжения. Плагин продолжения также предоставляет DSL для определения потоков управления, таких как stateless-future
или scala.async
. Я создал следующую таблицу для сравнения трёх DSL:
stateless-future | scala.concurrent.Future и scala.async | scala.util.continuations | |
---|---|---|---|
Stateless | Да | Нет | Да |
Threading-free | Да | Нет | Да |
Обработка исключений в «A-Normal Form» | Да | Нет | Нет |
Оптимизация хвостового вызова в «A-Normal Form» | Да | Нет | Нет |
Сопоставление с образцом в «A-Normal Form» | Да | Да | Нестабильно |
Lazy val в «A-Normal Form» | Нет из-за некоторых основных ошибок scala.reflect | Только для тех, которые не содержат await
|
Нестабильно |
build.sbt
, если вы используете Sbt (http://www.scala-sbt.org/):libraryDependencies += "com.qifun" %% "stateless-future" % "0.1"
stateless-future
должен работать со Scala 2.10.3, 2.10.4 или 2.11.0.
lazy val
в блоке магии Future
.val
с одинаковым именем в одном блоке Future
, последний val
может быть неожиданно использован.Клонируйте stateless-future-test (https://github.com/Atry/stateless-future-test) и запустите тестовые случаи, чтобы проверить эти ограничения.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )