我知道这可能是一个愚蠢的问题,但是由于我是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
答案 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