Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 如何推断此函数的类型?_Recursion_Functional Programming_Ocaml_Type Inference - Fatal编程技术网

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
    ,并返回a
    c
    。非常感谢。这很有教育意义。我不明白的是,为什么最后一对括号可以省略?@Indicator这是正确的关联->操作符的工作方式,它是这样做的,因为如果你有一个函数
    f::a->b->c
    ,那么这意味着如果你只提供a参数,你就得到了一个函数
    b->c
    。这是咖喱。OTOH,如果类型是
    (a->b)->c
    ,这意味着您有一个单参数函数,它接受另一个函数
    a->b
    ,并返回一个
    c