почему F # failwith возвращает универсальный тип, а не тип исключения - PullRequest
6 голосов
/ 23 июня 2019

Согласно документам функция failwith возвращает Exception Но сигнатура функции string -> 'a

Почему подпись не string -> Exception?

1 Ответ

9 голосов
/ 23 июня 2019

В документах не говорится, что failwith возвращает Exception.Он говорит, что генерирует исключение F #.Система исключений отделена от обычного потока управления возвращаемыми значениями.Отсюда и название, это исключительная .

Исключения, когда слово «выброшенный» (который, как мне кажется, является менее двусмысленным, чем «сгенерированный», используемый в документах), поднимется вверхстек до тех пор, пока не встретится конструкция try ... with, которая обрабатывает этот конкретный тип исключения, или, если нет, завершит программу.Подробности см. В документации F # по обработке исключений .

failwith возвращает 'a, так что его можно использовать где угодно, поскольку 'a может означать что угодно.Он может притворяться, что возвращает что-либо, потому что он вообще никогда не возвращает, в отличие от большинства функций, он всегда выдает исключение.Если бы он возвратил Exception, он мог бы использоваться только в выражениях, которые, как ожидается, будут иметь значение Exception, что является необычно необычным, поскольку исключения обычно генерируются, а не возвращаются.Например, с учетом:

if i > 0 then
  i
else
  failwith "i is negative"

Если бы failwith вернул Exception, компилятор жаловался бы здесь на int, ожидаемое вместо Exception, поскольку первая ветвь оценивается как int.Но так как failwith возвращает 'a, вместо этого подразумевается, что он равен int, и все в порядке.

...