Ocaml:如何使用特定类型定义功能

时间:2019-09-12 15:20:25

标签: 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。相反,它的类型是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

1 个答案:

答案 0 :(得分:1)

类型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

我们可以像add 3 5(而不是add(3,5)!)那样申请(调用)

因此,定义sigma函数的常规方法是

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