Как в SML утверждать, что возникло определенное исключение?

Не прилагая усилий для фактического клонирования JUnit или чего-то подобного, я собираю несколько служебных функций, чтобы помочь протестировать некоторый код SML. Я знаю о QCheck, но он тоже не может этого сделать, да и вообще я не хочу. (Но если вам известна другая среда автоматического тестирования для SML, сообщите об этом.)

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

fun broken x = raise Fail

я бы хотелось бы иметь возможность написать что-то вроде

throws ("ERROR: function is not broken enough!", fn () => broken 1, Fail)

и получить ошибку, если данная функция не вызывает ожидаемое исключение.

Я попытался написать функцию throws с типом (строка * exn * (unit -> не определяет равенство по сравнению с исключениями:

sexp-tests.sml:54.31-57.49 Error: types of rules don't agree [equality type required]
  earlier rule(s): ''Z -> unit
  this rule: exn -> 'Y
  in rule:
    exn => raise exn
sexp-tests.sml:54.31-57.49 Error: handler domain is not exn [equality type required]
  handler domain: ''Z
  in expression:
    func ()
    handle 
        e' => if e = e' then () else raise (ERROR <exp>)
    | exn => raise exn

В качестве обходного пути, я подозреваю, я мог бы просто повторно использовать существующую assert функцию, которая у меня есть:

assert ((broken 1; false) handle Fail => true | _ => false)

Но это немного больше мышления и набора текста.

Итак, есть ли способ написать, что вызывает функцию в SML?

7
задан Wang 13 May 2011 в 05:04
поделиться