プログラミング言語 Standard ML 入門 (問題の解答例)
6 リスト

6.2 リスト型(τ list

問 6.2

以下の各関数について型が正しいか判定し,正しければその型を推定し, 正しくなければ型エラーの原因を考察せよ.

  • fun L1 a = a :: a

  • fun L2 a = a :: [a]

  • fun L3 (a,b) = a :: b

  • fun L4 (a,b) = (a :: b,b :: a)

  • fun L5 (a,b) = [a] :: b

  • fun L6 (a,b) = a :: [b]

  • fun L7 (a,b) = (a,b)::[(a,b)]

解答例  以下、型が正しければ、SML#が推論する型を示す、正しくなければその理由を記す。

  • fun L1 a = a :: a
    型エラーである。引数aττ listとして使用されている。

  • fun L2 a = a :: [a]

       # fun L2 a = a :: [a];
       val L2 = fn : [’a. ’a -> ’a list]
    
  • fun L3 (a,b) = a :: b

       # fun L3 (a,b) = a :: b;
       val L3 = fn : [’a. ’a * ’a list -> ’a list]
    
  • fun L4 (a,b) = (a :: b,b :: a)
    型エラーである。引数abは、 a :: bは、「bの型はτ listで、aの型は τ」であるという関係を b :: aは、「aの型はτ listで、bの型は τ」であるという関係をそれぞれ要求するが、これら条件を同時に満たす (有限の)型は存在しない。

  • fun L5 (a,b) = [a] :: b

       # fun L5 (a,b) = [a] :: b;
       val L5 = fn : [’a. ’a * ’a list list -> ’a list list]
    
  • fun L6 (a,b) = a :: [b]

       # fun L6 (a,b) = a :: [b];
       val L6 = fn : [’a. ’a * ’a -> ’a list]
    
  • fun L7 (a,b) = (a,b)::[(a,b)]

       # fun L7 (a,b) = (a,b)::[(a,b)];
       val L7 = fn : [’a, ’b. ’a * ’b -> (’a * ’b) list]