Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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
Ocaml:如何定义具有特定类型的函数_Ocaml - Fatal编程技术网

Ocaml:如何定义具有特定类型的函数

Ocaml:如何定义具有特定类型的函数,ocaml,Ocaml,我知道这可能是个愚蠢的问题,但由于我是Ocaml新手,请给我一些关于定义特定类型函数的提示 我想定义类型为int*int*(int->int)->int的函数 所以我做了一个这样的函数 let rec sigma a b func:int->int= if a >= b then func(a) else func(a) + sigma(a+1, b, func) 但是这里的sigma函数没有类型int*int*(int->int)->int。相反,它的类型是

我知道这可能是个愚蠢的问题,但由于我是Ocaml新手,请给我一些关于定义特定类型函数的提示

我想定义类型为int*int*(int->int)->int的函数

所以我做了一个这样的函数


let rec sigma a b func:int->int= 
    if a >= b then func(a)
    else func(a) + sigma(a+1, b, func)

但是这里的sigma函数没有类型
int*int*(int->int)->int
。相反,它的类型是int->int->(int->int)->int

我应该如何定义函数sigma的类型
int*int*(int->int)->int

(错误信息:


Error: This expression has type 'a * 'b * 'c
       but an expression was expected of type int


类型
int*int*(int->int)->int
表示接受3元组并返回和整数的函数。元组(对、三元组、四元组等)写为
(a、b、c等)
,例如

 let rec sigma (a,b,func) : int = 
    if a >= b then func(a)
    else func(a) + sigma(a+1, b, func)
尽管如此,在OCaml中通过元组传递参数通常不是一个好主意。这会妨碍咖喱化,效率低下(每个元组被装箱到一个单独的值中),并且通常不起作用,也不好用

此外,当约束函数的参数时,应将其括起来,例如,
(func:int->int)

OCaml中的函数通常是通过并置函数名及其参数来应用的,例如,给定一个函数
add

let add x y = x + y
我们可以像
add3.5
(而不是
add(3,5)
!)一样应用(称之为)

因此,定义西格玛函数的传统方法是

let rec sigma a b func : int = 
  if a >= b then func a
  else func a + sigma (a+1) b func