プログラミング言語 Standard ML 入門 (問題の解答例)
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)
型エラーである。引数aとbは、 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]