プログラミング言語 Standard ML 入門 (問題の解答例)
2 関数を用いたプログラミング

2.1 関数の定義

問 2.1

関数 fg を以下のように定義する.

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型の組である必要がある。