SML型人工推理

SML型人工推理,sml,type-inference,Sml,Type Inference,你好,我正在准备期末考试,考试中总是有ml类型的推断。 i、 e.我们被要求编写如下函数类型: fun ugh x y z = x z (y z); val ugh = fn : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c 或 然而,在我试图推断类型的所有方法中,我总是弄错。 虽然网上有一些例子,但是没有类似的函数的例子。 有没有一种方法可以按照一些指导原则组成这个类型? 如果将指南应用于第一个示例,则效果最佳 是的

你好,我正在准备期末考试,考试中总是有ml类型的推断。 i、 e.我们被要求编写如下函数类型:

fun ugh x y z = x z (y z);
val ugh = fn : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c

然而,在我试图推断类型的所有方法中,我总是弄错。 虽然网上有一些例子,但是没有类似的函数的例子。 有没有一种方法可以按照一些指导原则组成这个类型?
如果将指南应用于第一个示例,则效果最佳

是的,有几个关于StackOverflow的手动类型推断示例:

  • 要推断
    的类型x y z=x z(y z)
    ,您可以这样开始

    val ugh : 'a -> 'b -> 'c -> 'd
    
    val doh : 'a -> 'b -> 'c -> 'd
    
    因为它需要三个咖喱的论点。您还可以看到,
    x:'a
    是两个当前参数的函数,
    y:'b
    是一个参数的函数,
    'd
    应该完全用
    'a
    'b
    'c
    表示

    因此,对于
    y
    的类型,设置
    'b='c->'e
    ,因为它将
    z:'c
    作为输入,并返回我们尚未得到的类型

    对于
    x
    的类型,设置
    'a='c->'e->'f
    ,因为它将
    z:'c
    y
    的输出作为输入,并返回我们尚未得到的类型

    替换这些,根据需要添加括号,您将得到

    val ugh : ('c -> 'e -> 'f) -> ('c -> 'e) -> 'c -> 'f
    
    val doh : (int -> 'e) -> int -> ('e -> int -> 'd) -> 'd
    
    在这一点上,您可能需要重命名它们,以便

    val ugh : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c
    
    但你真的不必这么做

    这里我唯一要考虑的是
    x
    的类型取决于
    y
    的类型,所以我想先确定这一点


  • 要推断
    fundohxyz=z(xy)(y+1)
    的类型,您也可以这样说

    val ugh : 'a -> 'b -> 'c -> 'd
    
    val doh : 'a -> 'b -> 'c -> 'd
    
    因为它也需要三个咖喱争论。最容易设置的是
    'b=int
    ,与第一个示例类似,您可以设置
    'a=int->'e
    ,然后设置
    'c='e->int->'d

    替换这些,根据需要添加括号,您将得到

    val ugh : ('c -> 'e -> 'f) -> ('c -> 'e) -> 'c -> 'f
    
    val doh : (int -> 'e) -> int -> ('e -> int -> 'd) -> 'd
    
    或者在稍微改名之后

    val doh : (int -> 'a) -> int -> ('a -> int -> 'b) -> 'b
    

  • 设置“c=int”和“b int->”e的方式类型应为:val doh:('e->int->'d)->(int->'e)->int->'d。更让我烦恼的是这些类型的正确顺序。从左到右开始,我们按参数在函数左侧出现的顺序放置参数,这意味着x->y->z->doh?加上编译器为doh提供了这种类型:(int->a)->int->('a->int->b)->'bYou在最后一个结果中交换了
    'a
    'c
    替换的位置。@Akismpa:您可以尝试按它们在屏幕上的显示顺序进行操作。但是,在第一个示例中,函数
    x
    将函数
    y
    的输出作为输入,由于我还没有将
    y
    的类型表示为一个函数,从一种类型到另一种类型,因此我无法就此展开
    x
    的类型。所以我把
    x
    搁置,开始推断
    y
    。您可能最终会遇到相互依赖或足够大的示例,严格遵循类型推断算法将是一种好处。但只要你能跟踪你头脑中的变数,我似乎就不需要了。