как обрабатывать деление на ноль ошибок в ML - PullRequest
4 голосов
/ 06 декабря 2011

Я новичок в ML.

Мне нужно определить функцию, принимающую условное выражение в качестве аргумента, проблема в том, что выражение недопустимо, например "10 div 0 = 0".Как я могу справиться с этим?

Например, функция определяется следующим образом: foo exp1 = if (exp1) then ... else..., а exp1 равно "10 div 0 = 0", как обработать эту ошибку деления.

1 Ответ

4 голосов
/ 06 декабря 2011

Похоже, вы хотите спросить о механизме обработки исключений в SML.

Функция div в базовой библиотеке SML вызывает исключение Div при вызове 10 div 0. Это зависит от того, нужно ли вам значение или нет для обработки исключения. В этом случае вы можете вернуть true / false или тип параметра:

(* only catch exception, ignore value *)
fun div_check (x, y) = (
  ignore (x div y);
  false
) handle Div => true

(* catch exception and return option value *)
fun div_check2 (x, y) = (
  SOME (x div y)
) handle Div => NONE

UPDATE:

Действительно странно, что компилятор не вызывает исключение Div в этом случае. Я предлагаю вам определить собственную функцию div и вызвать / обработать исключения самостоятельно:

exception DivByZero;

(* custom div function: raise DivByZero if y is zero *)
infix my_div;
fun x my_div y =
  if y=0 then raise DivByZero else x div y

fun div_check (x, y) = (
  ignore (x my_div y);
  false
) handle DivByZero => true

fun div_check2 (x, y) = (
  SOME (x my_div y)
) handle DivByZero => NONE
...