Ocaml:如何定义具有特定类型的函数
我知道这可能是个愚蠢的问题,但由于我是Ocaml新手,请给我一些关于定义特定类型函数的提示 我想定义类型为int*int*(int->int)->int的函数 所以我做了一个这样的函数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。相反,它的类型是
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