Непонятно объяснение исключения Checked в функциональном программировании на Scala.

В книге «Функциональное программирование на Scala» есть несколько слов о проверенном исключении:

Проверенные исключения

Проверенные исключения в Java, по крайней мере, вынуждают принять решение о том, следует ли обрабатывать или повторно вызывать ошибку, но они приводят к значительному шаблону для вызывающих. Что еще более важно, они не работают для функций более высокого порядка, которые не могут знать о конкретных исключениях, которые могут быть вызваны их аргументами. Например, рассмотрим функцию map, которую мы определили для List:

def map[A,B](l: List[A])(f: A => B): List[B]

Эта функция явно полезна, очень универсальна и противоречит использованию проверенных исключений — у нас не может быть версии карты для каждого отдельного проверенного исключения, которое может быть вызвано f. Даже если бы мы захотели это сделать, как бы карта узнала, какие исключения возможны? Вот почему общий код, даже в Java, так часто прибегает к использованию RuntimeException или какого-либо общего проверенного типа Exception.

Я прочитал этот раздел несколько раз, но до сих пор не понимаю, почему проверяемое исключение не работает для функций более высокого порядка.

Может ли кто-нибудь привести несколько примеров, чтобы сделать это более понятным?


person Freewind    schedule 14.07.2015    source источник


Ответы (1)


Попробуйте написать функцию map<A, B> на Java. В какой-то момент вам понадобится вызвать функцию сопоставления. Ваша функция сопоставления может быть чем угодно и генерировать любое исключение, которое ей нравится. Функция map не может включать в свою сигнатуру все возможные исключения, которые может выдать преобразователь, потому что она не знает, что это такое. Невозможно написать сигнатуру типа map с проверенными исключениями.

Предположим, подпись map была чем-то вроде Colletion<B> map<A, B>(Function<A,B>, Collection<A>). Теперь предположим, что мы называем это map(x -> throw new IOException, Lists.of(1,2,3)). Поскольку IOException проверено, оно должно появиться в сигнатуре map, но пока вы не вызвали map, оно не подозревало, что может генерировать исключение такого типа.

person tryx    schedule 14.07.2015