プログラミング言語 Standard ML 入門 (問題の解答例)
12 基本ライブラリの利用法

12.2 Generalストラクチャ

問 12.3

以下の汎用エラー処理関数を定義せよ. 関数とその引数,さらにエラーの場合に返す値を受け取り,関数を引数に適用すると ともに,上記の基本演算のエラーをキャッチしエラーメッセージを表示した後,エ ラーの場合の値を返す,

    catchAll : (’a -> ’b) -> ’a -> ’b -> ’b

たとえば,
- catchAll (fn (x,y) => x div y) (1,0) 999; divide by zero val it = 999 : int  
のように動作する.

解答例  以下にSML#での定義と実行の例を示す。

   # fun catchAll f x z =
         f x handle en => (print (exnMessage en ^ "\n"); z);
   val catchAll = fn : [’a, ’b. (’a -> ’b) -> ’a -> ’b -> ’b]
   # catchAll (op div) (1,0) 999;
   Div at (interactive):9.12
   val it = 999 : int

(注)Generalストラクチャの0除算例外名はdivide by zeroではなくDivである。