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