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-&

我是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
    的类型相同,即
    β=类型(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