【问题标题】:Ocaml: How to define function with specific typeOcaml:如何定义具有特定类型的函数
【发布时间】:2020-01-14 12:26:21
【问题描述】:

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

【问题讨论】:

    标签: ocaml


    【解决方案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 中通过元组传递参数通常是个坏主意。它阻碍了currying,效率低下(每个元组都被装箱成一个单独的值),并且通常没有功能并且不好。

    另外,当你约束一个函数的参数时,你应该给它加上括号,例如,(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
    

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 1970-01-01
      • 2022-10-14
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      相关资源
      最近更新 更多