f: 'a -> b' -> c' -> d' 在ocaml中是什么意思?

What does f: 'a -> b' -> c' -> d' mean in ocaml?

如果我有一个函数 f 定义为

f: 'a -> 'b -> c' -> d'

这是否意味着它需要一个参数?还是3个?然后它输出一个参数?我将如何使用或调用这样的函数?

正如 Glennsl 在评论中指出的那样,这意味着两者。

非常简短,但绝不全面,从学术角度来看,OCaml 中的任何函数都需要 一个 个参数或 return 多于或少于 一个值。例如,一个接受单个参数并向其添加 1 的函数。

fun x -> x + 1

我们可以通过以下两种方式之一为该函数命名:

let inc = fun x -> x + 1

或者:

let inc x = x + 1

无论哪种方式,inc 都具有类型 int -> int,这表明它采用 int 并且 return 具有 int 值。

现在,如果我们想添加 两个 整数,好吧,函数只接受 一个 参数...但是函数首先是 class 东西,这意味着一个函数可以创建和 return 另一个函数。

let add = 
  fun x -> 
    fun y -> x + y

现在 add 是一个接受参数 x 的函数,而 return 是一个接受参数 y 和 return 的函数xy.

我们可以使用类似的方法来定义一个将三个整数相加的函数。

let add3 =
  fun a -> 
    fun b -> 
      fun c -> a + b + c

add 的类型为 int -> int -> intadd3 的类型为 int -> int -> int -> int

当然,OCaml 不是纯粹的学术语言,所以有方便的语法。

let add3 a b c = a + b + c

推断类型

在你的问题中,你询问了一个类型 'a -> 'b -> 'c -> 'd``. The examples provided work with the concrete type int. OCaml uses type inferencing. The compiler/interpreter looks at the entire program to figure out at compile time what the types should be, without the programmer having to explicitly state them. In the examples I provided, the +operator only works on values of typeint, so the compiler _knows_ incwill have typeint -> int`。

但是,如果我们定义一个身份函数:

let id x = x

她没有说x应该有什么类型。事实上,它可以是任何东西。但是可以确定的是,函数是否具有相同的参数类型和 return 值。由于我们不能在其上放置具体类型,OCaml 使用占位符类型 'a.

如果我们创建了一个函数来从两个值构建一个元组:

let make_tuple x y = (x, y)

我们得到类型 'a -> 'b -> 'a * 'b.

总结

所以当你询问:

f: 'a -> 'b -> 'c -> 'd

这是一个函数 f,它接受三个类型为 'a'b'c 的参数,并且 returns 是一个类型为 'd.