プログラミング言語 Standard ML 入門 (問題の解答例)
3 MLの型システム

3.1 型推論と静的型チェック

問 3.1

以下のそれぞれのプログラムはいずれも型エラーを含む. それぞれについて,型エラーの原因を指摘せよ.

  • 3 * 3.14

  • fun f1 x = (x 1,x true)

  • fun f2 x y = if true then x y else y x

  • fun f3 x = x x

解答例 

  • 3 * 3.14

    組み込み演算*の引数はすべて整数型かすべて実数型のどちらかでなけ ればならず,整数型と実数型は混在できない.MLに自動的な型変換はない.

  • fun f1 x = (x 1,x true)

    関数xの引数の型がint型とbool型の2通りに使われている. MLでは,多相型が与えられる名前は関数宣言およびval宣言されたもののみであ り,パターンの中に現れる変数は,そのスコープでは単相型をもつ.

  • fun f2 x y = if true then x y else y x

    x yxの型がyの型を引数の型とする関数型である ことを要求し, y xyの型がxの型を引数の型とする関数型である ことを要求するが,これら2つの条件は循環しており,これらを同時に満たす型 は(有限の型の世界では)存在しない.

  • fun f3 x = x x

    x xxの型がxの型を引数の型とする関数型である ことを要求するが,この条件を満たす型は(有限の型の世界では)存在しない.

(補足)型の意味を,型に属する値の集合と見なし,関数の意味を引数と結果の 組の集合と考えると,x xは自分自身を部分として含む集合となり,矛盾す る.さらに興味がある読者は,「ラッセルのパラドクス」に関するトピックを調 べてみよ.