Я прохожу через функциональное программирование в Scala (автор: Paul Chiusano и Runar Bjarnarson), приведенное ниже объяснение для того, чтобы не использовать ниже общей функции для обработки исключений. Он говорит, что если мы делаем вычисление лагеря, мы не должны использовать, что именно означает это. Объясните, пожалуйста, простой пример. Благодаря !!Обработка исключений в функциональном программировании Scala
ответ
Используйте типы, чтобы сообщать о случаях ошибок, а не значения
Позволяет программу под названием Foo
использует функцию mean
. К сожалению, пустая строка IndexedSeq
отправляется в качестве аргумента функции mean
. В этом случае функция mean
вернет onEmpty
, которая является двойной.
Потому что mean
возвращает double, когда IndexedSeq
пуст, программа-вызыватель (программа Foo) не может отличить нормальный случай (где список не пуст) и неопределенный случай (где список пуст).
Проблема с функцией
mean
она возвращаетDouble
как в неопределенном случае и обычный случай, когда список не пуст.
val someList = List.empty[Double]
val meanValue = mean(someList, -1)
if (meanValue == - 1) //undefined case else meanValue
приведенный выше способ проверки неопределенное значение функции mean
не рекомендуется.
Автор хочет сообщить неопределенное состояние, используя какой-либо тип.
Вот как мы можем сделать это
def mean(list: List[Double]): Option[Double] = {
if (list.isEmpty) None
else Some(list.sum/list.length)
}
выше mean
функция вернет None, если не определено случай встречается (список пуст) и не зависит от небезопасной связи возвращает значение.
Foo
программа может остановить вычисления, когда неопределенное это возвращает функцию mean
или Foo
программы может занять другую ветвь, когда столкновение на неопределенном значении (значение, возвращаемую функцией mean
, когда список пуст). Но программа Foo
должна ответить на значение onEmpty
, чтобы проверить неопределенный случай.
Представьте, что ваша программа может получить список List(-2.0, 0.0)
.
val list = List(-2.0, 0.0)
val theMean = mean(list, -1.0)
// now I want to handle the error case
if (theMean == -1.0)
println("mean can't be computed!") // wrong!
Если mean
не буду принимать какое-то глупое значение по умолчанию, но будет возвращать Option[Double]
или Either[String,Double]
или ... это уже не возможно сделать такую ошибку.
Да! теперь я ясно. pamu дал инструкцию, которая явно соответствует вашему примеру. i.e «использовать типы для передачи ошибок, а не значений» –
- 1. Обработка исключений в scala
- 2. Реализация состояний в функциональном программировании
- 3. scala io Обработка исключений
- 4. Интерфейсы в функциональном программировании
- 5. Векторизация в функциональном программировании
- 6. тестирование в функциональном программировании
- 7. Mutability в функциональном программировании
- 8. Как избежать побочных эффектов в функциональном программировании
- 9. Обработка инкрементного моделирования данных Изменения в функциональном программировании
- 10. Обработка исключений Akka 2.1 (Scala)
- 11. Условное «назначение» в функциональном программировании
- 12. бесконечный цикл в функциональном программировании?
- 13. Математические функции в функциональном программировании
- 14. Место закрытия в функциональном программировании
- 15. Зависимость впрыска в функциональном программировании
- 16. Akka Scala Camel. Обработка исключений
- 17. для vs map в функциональном программировании
- 18. Сортировка выбора в функциональном Scala
- 19. Обработка исключений вокруг сдвига в Scala
- 20. Обработка исключений качания в приложении scala
- 21. Scala: обработка исключений в анонимной функции
- 22. Использование исключений в функциональном модуле
- 23. Что возвращает функция при «функциональном времени ноль» в функциональном программировании?
- 24. Scala - Обработка XML для объектов JSON в функциональном стиле
- 25. Понимание рекурсивных алгебраических типов в функциональном программировании
- 26. Сложная функция в функциональном программировании javascript
- 27. Существуют ли «алгоритмы» в функциональном программировании?
- 28. Использование Stack & Queue в функциональном программировании (javascript)
- 29. свободные и связанные идентификаторы в функциональном программировании
- 30. Конструктивная сплошная геометрия в функциональном программировании
Да, я понял, как использовать общий способ программирования (например, использование опции), не полагаясь на ввод программистов (например, -1, кто-то может дать -5). Но этот способ также может справиться с вещами. Вы пытаетесь сказать, что мы должны использовать более общий способ программирования, чтобы избежать ошибок. –
@PriyaranjanSwain использует типы для связи ошибок, а не значений – pamu
Не следует 'else list.sum/list.length' быть' else Some (list.sum/list.length) '? –