And*_*ang 0 syntax ocaml type-inference higher-order-functions type-signature
我在理解OCaml中高阶函数的函数类型签名时遇到麻烦。
fun f -> f 3
(int -> a) -> a
Run Code Online (Sandbox Code Playgroud)
我处理的方式是该f 3部分将一个int作为输入并返回由函数定义的类型,该类型f表示为a。所以真的fun f是一种类型(int->a)。但是,最后a一个来自(int -> a) -> a哪里?
您的第一个示例是这样的:
fun f -> f 3
Run Code Online (Sandbox Code Playgroud)
我认为您可能会感到困惑的是,您正在将其视为名为的函数的定义f。不是这种情况。这是代表函数的匿名值,也称为lambda。该f代表放慢参数此匿名函数。
为了使情况更清楚,让我们为函数命名g。换句话说,假设我们这样定义g:
let g = fun f -> f 3
Run Code Online (Sandbox Code Playgroud)
好的,g带一个参数的函数也是f。该f参数显然是一个函数,因为我们看到它被应用于3。(即,我们看到它以3作为参数被调用。)g返回什么?f当您调用它时,它将返回任何返回值,对吗?
由于g是一个函数,其类型必须是这种形式的:
d -> c
Run Code Online (Sandbox Code Playgroud)
即,它接受某种类型的d东西并返回某种类型的东西c。从上面的推理中,我们知道这d是一个函数类型,并且我们还知道该函数的返回类型也是的返回类型g。因此,如果d是(更详细地)b -> a,则完整类型为g:
(b -> a) -> a
Run Code Online (Sandbox Code Playgroud)
但是,我们也知道函数参数f接受一个int参数,因为我们看到它被应用于3。所以类型b必须是int。这给我们以下类型的信息g:
(int -> a) -> a
Run Code Online (Sandbox Code Playgroud)
我希望这有助于使事情变得更清楚。