SML型人工推理
你好,我正在准备期末考试,考试中总是有ml类型的推断。 i、 e.我们被要求编写如下函数类型: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 或 然而,在我试图推断类型的所有方法中,我总是弄错。 虽然网上有一些例子,但是没有类似的函数的例子。 有没有一种方法可以按照一些指导原则组成这个类型? 如果将指南应用于第一个示例,则效果最佳 是的
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
。您可能最终会遇到相互依赖或足够大的示例,严格遵循类型推断算法将是一种好处。但只要你能跟踪你头脑中的变数,我似乎就不需要了。