2016-08-15 80 views
1

我完全失去了对这个。有人解释说,功能是正确的,所以let add x y = x + y;;有一个函数类型int -> int -> intint -> (int -> int)OCaml的 - 给类型的函数(INT - > INT) - > INT

我不知道我怎么会定义(int -> int) -> int类型的函数。我想我会有第一个参数是一个函数,通过int并返回int。我已经试过:

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

let add = fun f x = (f x) + 3 --- ('a -> int) -> 'a -> int

+0

类型add'的'是正常的:'F'可以,只要它返回一个'int'能够执行加法带走任何东西。例如'add int_of_string“2”'是有效的。编译器生成最常用的类型,并且没有任何限制'x'的类型。如果你写了'let add f x = f(x + 1)+ 3',那将是不同的。 – ChriS

回答

2

什么

let eval (f: int -> int) :int = f 0 

+0

对不起,我还没有学过这种定义函数的方法。有没有办法做到这一点没有冒号? – stumped

+3

冒号用于注释某种类型的东西,通常只对人类读者有用。你可以省略类型注释:'let eval f = f 0 + 0' –

0
fun x -> (x 1) + 1;; 
- : (int -> int) -> int = <fun> 

let foo f = (f 1) + 1;; 
val foo : (int -> int) -> int = <fun> 

它就像

foo (fun x -> x + 1);; 
- : int = 3 
0

您的问题是高度的Currying概念相联系。

但在此之前,让我说,如果你要编写需要一个参数是一个函数的函数,你可以声明一个正常的功能,只需使用其参数的功能等。没有必要使它复杂化。参见例如:

let f x = x(10) + 10 

现在来了咖喱部分。在OCaml中,参数在语义上每次只评估一个参数,在评估一个参数之后,返回一个匿名函数。这很重要,因为它可以让你提供函数的部分参数,有效地创建一个新函数(称为部分应用程序)。

在下面的示例中,我使用+作为函数(运算符周围的括号将其转换为正常函数),以创建增量函数。并将其应用于之前的f函数。

let incr = (+) 1 
f incr 

的代码评估为f incr = incr(10) + 10 = 21

link有适用于OCaml的更多相关信息。

相关问题