了解功能类型签名

问题描述 投票:0回答:2

我无法理解OCaml中高阶函数的函数类型签名。

fun f -> f 3
(int -> a) -> a

我处理这个的方式是f 3部分采用int作为输入并返回由函数f定义的类型,表示为a。所以真的,fun f是一种(int->a)。但那么a (int -> a) ->的最后一个a来自哪里?

syntax ocaml type-inference higher-order-functions type-signature
2个回答
5
投票

你的第一个例子是这样的:

fun f -> f 3

我认为您可能遇到的一个可能的困惑是,您将此视为名为f的函数的定义。不是这种情况。这是一个表示函数的匿名值,也称为lambda。 f代表了这个匿名函数的参数。

为了让事情更清楚,让我们给这个函数命名为g。换句话说,假设我们像这样定义g

let g = fun f -> f 3

好的,所以g是一个带有一个参数f的函数。这个f参数显然是一个函数,因为我们看到它被应用于3.(即,我们看到它被调用3作为参数。)g返回什么?当你调用它时,它会返回f返回的任何内容,对吧?

由于g是一个函数,它的类型必须是这种形式:

d -> c

即,它接受d类型的东西并返回类型为c的东西。从上面的推理,我们知道d是一个函数类型,我们也知道这个函数的返回类型也是g的返回类型。因此,如果d(更详细地)b -> a,那么完整类型的g是这样的:

(b -> a) -> a

但是我们也知道函数参数f采用int参数,因为我们看到它被应用于3.因此类型b必须是int。这给了我们以下g的类型:

(int -> a) -> a

我希望这有助于使事情更加清晰。


0
投票

我们可以注释匿名函数:

fun (f : int -> 'a) -> (f 3 : 'a)

即,这是从f : int -> 'a'a的功能,所以这是你的最后一个'a来自哪里。

© www.soinside.com 2019 - 2024. All rights reserved.