Recursion 如何推断此函数的类型?
我挠头想弄清楚这个函数的签名Recursion 如何推断此函数的类型?,recursion,functional-programming,ocaml,type-inference,Recursion,Functional Programming,Ocaml,Type Inference,我挠头想弄清楚这个函数的签名 let make_rec f_norec = let rec f x = f_norec f x in f 应该是哪一个 valmake\u rec:(('a->'b)->'a->'b)->'a->'b= 注意,有一个奇怪的递归定义。我肯定错过了一些知识。有谁能告诉我如何计算函数的类型(就像类型推断系统那样) 非常感谢。从内部开始,向外工作: 让我们把xa 然后f具有类型a->b,其中b是f f_norec接受f和x,并且它必须返回与f相同的类型,因此(a
let make_rec f_norec =
let rec f x = f_norec f x in
f
应该是哪一个
valmake\u rec:(('a->'b)->'a->'b)->'a->'b=
注意,有一个奇怪的递归定义。我肯定错过了一些知识。有谁能告诉我如何计算函数的类型(就像类型推断系统那样)
非常感谢。从内部开始,向外工作:
x
a
f
具有类型a->b
,其中b
是f
f_norec
接受f
和x
,并且它必须返回与f
相同的类型,因此(a->b)->a->b
make_rec
接受f_norec
,并返回f
。因此((a->b)->a->b)->(a->b)
。出于语法原因,最后一对括号可以省略从内部开始,向外工作:
x
a
f
具有类型a->b
,其中b
是f
f_norec
接受f
和x
,并且它必须返回与f
相同的类型,因此(a->b)->a->b
make_rec
接受f_norec
,并返回f
。因此((a->b)->a->b)->(a->b)
。出于语法原因,最后一对括号可以省略谢谢。这很有教育意义。我不明白的是,为什么最后一对括号可以省略?@Indicator这是正确的关联->操作符的工作方式,它是这样做的,因为如果你有一个函数
f::a->b->c
,那么这意味着如果你只提供a参数,你就得到了一个函数b->c
。这是咖喱。OTOH,如果类型是(a->b)->c
,这意味着您有一个单参数函数,它接受另一个函数a->b
,并返回ac
。非常感谢。这很有教育意义。我不明白的是,为什么最后一对括号可以省略?@Indicator这是正确的关联->操作符的工作方式,它是这样做的,因为如果你有一个函数f::a->b->c
,那么这意味着如果你只提供a参数,你就得到了一个函数b->c
。这是咖喱。OTOH,如果类型是(a->b)->c
,这意味着您有一个单参数函数,它接受另一个函数a->b
,并返回一个c
。