プログラミング言語 Standard ML 入門 (問題の解答例)
2.1 関数の定義
問 2.1
関数 f と g を以下のように定義する.
fun f x = (x,2) ; |
fun g (x,y) = x + y; |
以下の各式について,式に誤りがなく結果が出るものはその結果を予想し,エラー となるものはそのエラーの原因を指摘せよ.
f f(1); | f (f 1); | f (f(1)); |
f (1,2); | (f 1,f 2); | g(1,2); |
g f(1); | g (f 1); | f g(1,2); |
f (g(1,2)); | g (f 1,f 2); | f (g 1,g 2); |
さらに,MLで実際に評価し,結果をチェックせよ.
解答例
-
•
f f(1); 型エラー。 関数適用は左結合であるから f f(1)は ((f f)(1)) と解釈される。 この場合f fの部分が型付け不可能。
-
•
f (f 1):
# f (f 1); val it = ( ( 1, 2 ), 2 ) : (int * int) * int
-
•
f (f(1)); 上記と同一の式である。
-
•
f (1,2);
# f (1,2); val it = ( ( 1, 2 ), 2 ) : (int * int) * int
-
•
(f 1,f 2);
# (f 1,f 2); val it = ( ( 1, 2 ), ( 2, 2 ) ) : (int * int) * (int * int)
-
•
g(1,2);
# g(1,2); val it = 3 : int
-
•
g f(1); 型エラー。 g fの部分が型付け不可能。
-
•
g (f 1);
# g (f 1); val it = 3 : int
-
•
f g(1,2); 型エラー。g fの部分が型付け不可能。
-
•
f (g(1,2));
# f (g(1,2)); val it = ( 3, 2 ) : int * int
-
•
g (f 1,f 2); 型エラー。gの引数はint型の組である必要がある。
-
•
f (g 1,g 2); 型エラー。gの引数はint型の組である必要がある。