Могут ли типы исключений быть общими? - PullRequest
5 голосов
/ 23 мая 2011

Я пробовал следующее, но это не работает.

exception MyError<'a> of 'a
exception 'a MyError of 'a

Нужно ли использовать длинную форму:

type MyError<'a>(value) =
  inherit System.Exception()
  member this.Value : 'a = value

1 Ответ

6 голосов
/ 23 мая 2011

Согласно спецификации, вы должны использовать длинную форму. Я не нашел никакого объяснения, почему это так, но грамматика для объявлений исключений выглядит следующим образом (и, возможно, также подсказывает, почему поведение такое, как вы описали):

исключение-определение: = атрибуты опция исключение тип-дела-объединение-данные

data-type-case-data: =
идент (случай с нулевым объединением)
идентификатор из тип * ... * тип (случай n -ного объединения)
выданный: uncurried-sig (случай n-арного объединения)

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

exception MyExn of int

... как объявление, добавляющее новый регистр к стандартному типу System.Exception (если это был дискриминированный союз). В этом случае вы не ожидаете, что сможете использовать параметр общего типа:

type System.Exception = 
  | ...
  | MyExn of int
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...