SML类型推断提示 [英] Hint for SML type inference
本文介绍了SML类型推断提示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我是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->c)->a->c
c)(int->a)->int->a
d)int->int
但我对最后一个问题有点困惑。 是否有任何提示可以扣除最后一种类型?
非常感谢。
推荐答案
让我们一步一步手动完成:
fun compCompA42 x = comp compA42 x
- 它是一个函数,因此
compCompA42
具有α -> β
类型。 compCompA42
的返回值必须与comp compA42 x
类型相同,即β = typeof(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
。SO、
α = b -> c = (int -> d) -> c
和β = typeof(comp compA42 x) = a -> c = (int -> d) -> c
。最后,
compCompA42
最常见的类型是α -> β = ((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
)。
这篇关于SML类型推断提示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文