SML类型推断提示
我是SML的新手,我正在尝试练习SML类型参考。我正在尝试扣除以下类型:SML类型推断提示,sml,type-inference,Sml,Type Inference,我是SML的新手,我正在尝试练习SML类型参考。我正在尝试扣除以下类型: a)fun add42 x =x+42 b)fun comp F G = let fun C x = G(F(x)) in C end c)fun compA42 x = comp add42 x d)val foo = compA42 add42 e)fun compCompA42 x = comp compA42 x 我认为前四个问题的解决方案是: a)int->int b)(a->b)->(b-&
a)fun add42 x =x+42
b)fun comp F G = let fun C x = G(F(x)) in C end
c)fun compA42 x = comp add42 x
d)val foo = compA42 add42
e)fun compCompA42 x = comp compA42 x
我认为前四个问题的解决方案是:
a)int->int
b)(a->b)->(b->c)->a->c
c)(int->a)->int->a
d)int->int
但我对最后一个有点困惑。
是否有任何提示扣除最后一种类型
非常感谢。让我们一步一步地手动执行此操作:
fun compCompA42 x = comp compA42 x
compCompA42
具有类型α->β
compCompA42
的返回值必须与comp-compA42 x
的类型相同,即β=类型(comp-compA42 x)
comp
提供了最通用的类型:
(a->b)->(b->c)->a->c
a->b=typeof(compA42)
和(b->c)=α的情况:
a->b=typeof(compA42)=(int->d)->int->d
。从这个方程可以得出a=int->d
和b=int->d
因此,α=b->c=(int->d)->c
和β=typeof(comp-compax)=a->c=(int->d)->c
最后,我们最常用的compa42
类型是
α->β=((int->d)->c)->(int->d)->c
请注意,您总是可以让一些SML解释器(例如smlnj)向您显示以下类型:
- fun compCompA42 x = comp compA42 x;
val compCompA42 = fn : ((int -> 'a) -> 'b) -> (int -> 'a) -> 'b
它与我们手动得到的类型相同(只需将d
重命名为'a
,将c
重命名为'b
)