4

私はMLが初めてです。

条件式を引数として取る関数を定義する必要があります。問題は、式が のように無効である場合"10 div 0 = 0"です。どうすればこれを処理できますか?

たとえば、関数は次のように定義されます。foo exp1 = if (exp1) then ... else...、およびexp1is "10 div 0 = 0"、この除算エラーの処理方法。

4

1 に答える 1

4

SML の例外処理機構についてお聞きになりたいようです。

SML 基底ライブラリのdiv関数は、 を呼び出すと 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

アップデート:

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
于 2011-12-06T16:31:09.217 に答える