Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function OCaml-给出一个类型为(int->;int)->;int_Function_Types_Functional Programming_Arguments_Ocaml - Fatal编程技术网

Function OCaml-给出一个类型为(int->;int)->;int

Function OCaml-给出一个类型为(int->;int)->;int,function,types,functional-programming,arguments,ocaml,Function,Types,Functional Programming,Arguments,Ocaml,我完全不明白这一点。据解释,函数是右对齐的,因此让x y=x+y的函数类型为int->int->int或int->(int->int) 我不确定如何定义(int->int)->int类型的函数。我想第一个参数应该是一个函数,它传入一个int,然后返回一个int。我试过: let add=fun x y->x+y--int->int->int 让add=funfx=(fx)+3--('a->int)->'a->int怎么样 let eval (f: int -> int) :int = f

我完全不明白这一点。据解释,函数是右对齐的,因此
让x y=x+y
的函数类型为
int->int->int
int->(int->int)

我不确定如何定义
(int->int)->int类型的函数。我想第一个参数应该是一个函数,它传入一个
int
,然后返回一个
int
。我试过:

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

让add=funfx=(fx)+3
--
('a->int)->'a->int

怎么样

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

您的问题与
咖喱的概念高度相关

但在此之前,我想说,如果你想写一个函数,需要一个参数才能成为函数,你可以声明一个普通函数,然后像函数一样使用它的参数。没必要把它复杂化。见前:

let f x = x(10) + 10
现在是咖喱部分。在OCaml中,参数在语义上一次只求值一个,求值一个参数后,返回一个匿名函数。这一点很重要,因为它允许您提供函数的部分参数,从而有效地创建一个新函数(称为部分应用程序)

在下面的示例中,我使用
+
作为函数(操作符周围的括号将其转换为普通函数),以创建增量函数。并将其应用于上一个
f
函数

let incr = (+) 1
f incr
代码的计算结果为
f incr=incr(10)+10=21


这里有关于应用于OCaml的主题的更多信息。

对不起,我还没有学会这种定义函数的方法。有没有一种不用冒号的方法呢?冒号是用来注释某种东西的类型,通常只对人类读者有用。您可以省去类型注释:
let eval f=f 0+0
add
的类型是正常的:
f
可以接受任何东西,只要它返回一个
int
,就可以执行加法。例如,字符串“2”的
addint\u
是有效的。编译器生成最通用的类型,并且没有约束
x
的类型。如果您编写了
让我们添加fx=f(x+1)+3
,则情况会有所不同。
foo (fun x -> x + 1);;
- : int = 3
let f x = x(10) + 10
let incr = (+) 1
f incr