После этого может возникнуть исключение,
exception BadParameter of int;
После этого может возникнуть исключение, которое можно обработать:
fun only_positive n =
if n <= 0 then raise BadParameter n
else...
val i = ...;
val j = only_positive i
handle
BadParameter 0 => 1;
BadParameter n => abs n;
Функция only_positive возбудит исключение BadParameter, если параметр не положителен. При вызове функции обработчик исключения присоединяется к вызывающему выражению, определяя значение, которое будет возвращено, если исключение наступит. Это значение можно использовать для дальнейших вычислений в точке, где произошло исключение; в этом случае оно используется только как значение, возвращаемое функцией.
16.7. Среда
Помимо определений функций и вычисления выражений программа на языке ML может содержать объявления:
val i = 20
val'S = "Hello world"
Таким образом, в языке ML есть память, но, в отличие от процедурных языков, эта память необновляемая; в данном примере нельзя «присвоить» другое значение i или s. Если мы теперь выполним:
val i = 35
будет создано новое именованное значение, скрывающее старое значение, но не заменяющее содержимое i новым значением. Объявления в языке ML аналогичны объявлениям const в языке С в том смысле, что создается объект, который нельзя изменить; однако повторное определение в языке ML скрывает предыдущее, в то время как в языке С запрещено повторно объявлять объект в той же самой области действия.
Блочное структурирование можно делать, объявляя определения или выражения как локальные. Синтаксис для локализации внутри выражения показан в следующем примере, который вычисляет корни квадратного уравнения, используя локальное объявление для дискриминанта:
val а = 1.0 and b = 2.0 and с = 1.0
let
D = b*b-4.0*a*c
in
((- b + D)/2.0*a, (- b - D)/2.0*a )