プログラミング言語 Standard 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 yはxの型がyの型を引数の型とする関数型である ことを要求し, y xはyの型がxの型を引数の型とする関数型である ことを要求するが,これら2つの条件は循環しており,これらを同時に満たす型 は(有限の型の世界では)存在しない.
-
•
fun f3 x = x x
x xはxの型がxの型を引数の型とする関数型である ことを要求するが,この条件を満たす型は(有限の型の世界では)存在しない.
(補足)型の意味を,型に属する値の集合と見なし,関数の意味を引数と結果の 組の集合と考えると,x xは自分自身を部分として含む集合となり,矛盾す る.さらに興味がある読者は,「ラッセルのパラドクス」に関するトピックを調 べてみよ.