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 的函数x
和 y
.
我们可以使用类似的方法来定义一个将三个整数相加的函数。
let add3 =
fun a ->
fun b ->
fun c -> a + b + c
add
的类型为 int -> int -> int
,add3
的类型为 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 type
int, so the compiler _knows_
incwill have type
int -> 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
.
如果我有一个函数 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 的函数x
和 y
.
我们可以使用类似的方法来定义一个将三个整数相加的函数。
let add3 =
fun a ->
fun b ->
fun c -> a + b + c
add
的类型为 int -> int -> int
,add3
的类型为 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 type
int, so the compiler _knows_
incwill have type
int -> 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
.