2017-01-02 3 views
0

Я прохожу через функциональное программирование в Scala (автор: Paul Chiusano и Runar Bjarnarson), приведенное ниже объяснение для того, чтобы не использовать ниже общей функции для обработки исключений. Он говорит, что если мы делаем вычисление лагеря, мы не должны использовать, что именно означает это. Объясните, пожалуйста, простой пример. Благодаря !!Обработка исключений в функциональном программировании Scala

enter image description here

ответ

3

Используйте типы, чтобы сообщать о случаях ошибок, а не значения

Позволяет программу под названием 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, чтобы проверить неопределенный случай.

+0

Да, я понял, как использовать общий способ программирования (например, использование опции), не полагаясь на ввод программистов (например, -1, кто-то может дать -5). Но этот способ также может справиться с вещами. Вы пытаетесь сказать, что мы должны использовать более общий способ программирования, чтобы избежать ошибок. –

+0

@PriyaranjanSwain использует типы для связи ошибок, а не значений – pamu

+0

Не следует 'else list.sum/list.length' быть' else Some (list.sum/list.length) '? –

1

Представьте, что ваша программа может получить список 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] или ... это уже не возможно сделать такую ​​ошибку.

+0

Да! теперь я ясно. pamu дал инструкцию, которая явно соответствует вашему примеру. i.e «использовать типы для передачи ошибок, а не значений» –

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