foo
次のように定義された関数があります
fun foo x y = x (x (x y));
関数の型を推測する方法は?
答えは次のとおりです。
val foo = fn : ('a -> 'a) -> 'a -> 'a
foo
次のように定義された関数があります
fun foo x y = x (x (x y));
関数の型を推測する方法は?
答えは次のとおりです。
val foo = fn : ('a -> 'a) -> 'a -> 'a
このプロセスは型推論と呼ばれ、SML でHindley–Milner アルゴリズムによって行われます。
まず、 のジェネリック型シグネチャから始めましょうfoo
:
val foo = fn : 'c -> 'b -> 'a
where x
has type'c
とy
has type 'b
。
次の手順があります。
x y
は関数の適用であり、x
署名が必要'b -> 'd
であり、方程式が'c = 'b -> 'd
あり、x y
type があり'd
ます。x (x y)
'b -> 'd
は、引数の型'd
so 'd = 'b
およびに関数型を適用することを意味します'c = 'b -> 'b
。x (x (x y))
'b -> 'b
引数の型に関数型を適用して(型の)'b
を返すことを意味します。それで十分です。'a
foo
'b = 'a
'c = 'a -> 'a and 'b = 'a
あります。foo
val foo = fn : ('a -> 'a) -> 'a -> 'a