Я пытаюсь сопоставить образец с исключением в его определении. Возможно ли что-то вроде следующего с использованием синтаксиса исключений F#, или я должен создать подкласс Exception
?
Я ожидал, что это сработает:
exception CoordErr of int * int
with
override this.Message =
let CoordErr(x, y) = this
sprintf "(%i %i)" x y //ERROR
Но выдаёт ошибки:
Значение или конструктор "x" не определено
Значение или конструктор "y" не определено
ИЗМЕНИТЬ
Я также попытался добавить скобки:
let (CoordErr(x, y)) = this
Но это дает ошибку:
Ожидалось, что это выражение будет иметь тип exn, но здесь имеет тип CoordErr.
ОБНОВЛЕНИЕ
Следующее работает, но не идеально:
exception CoordErr of int * int
with
override this.Message =
sprintf "(%i %i)" this.Data0 this.Data1
Есть ли другой способ сделать это?
ОБНОВЛЕНИЕ 2
Принимая во внимание ответ kvb, я полагаю, что мог бы сделать следующее, чтобы проглотить предупреждение incomplete matches
:
exception CoordErr of int * int
with
override this.Message =
match this :> exn with
| CoordErr(x, y) -> sprintf "(%i %i)" x y
| _ -> Unchecked.defaultof<_>
Unchecked.defaultof<_>
наfailwith "impossible"
- person Brian   schedule 17.02.2011