OCaml中的GCD(初学者)

时间:2014-12-16 23:57:52

标签: ocaml greatest-common-divisor

我想写这个简单的代码:

let rec gcd a b =
        if b = 0 then a else gcd b (a mod b);;
val gcd : int -> int -> int = <fun>

Printf.printf "%d da \n" gcd 55 200 ;;

这是代码,我得到的错误是:

File "tst.ml", line 3, characters 0-3:
Error: Syntax error

而且,任何人都可以向我解释什么是“int - &gt; int - &gt; int =”所有关于?我知道它必须是函数的参数和返回值,但是什么以及如何? :)

3 个答案:

答案 0 :(得分:4)

您将gcd 55200作为printf的单独参数传递。所以,试试这个:

Printf.printf "%d da\n" (gcd 55 200);;

答案 1 :(得分:4)

看起来你做了一些副本&amp;从ocaml交互式会话粘贴,因为通常我们不会混淆函数定义(2个第一行)和函数声明(第三行,但在这种情况下,它看起来更像是提供的ocaml解释器的答案定义 - 因为<fun>部分在程序中没有语法正确,但解释器使用它来表明它发现该值是 fun ction)在同一范围内。

所以,你不应该包括第三行,你必须修复最后一条指令,正如@JeffreyScofield所解释的那样。

(* gcd function definition *)
let rec gcd a b =
    if b = 0 then a else gcd b (a mod b);;

(* val gcd: int -> int -> int *)

Printf.printf "%d da \n" (gcd 55 200);;

或者,可以写下最后一行:

Printf.printf "%d da \n" @@ gcd 55 200;;

错误包含的函数签名表示gcd采用2个整数参数的序列,并返回一个整数。该符号被称为curry形式:传递给函数 A 的每个参数产生另一个 B 函数,期望 A 的其余参数。因此,您可以通过以下几种方式阅读该签名:

  • 作为一个取2个整数并返回一个的函数,

    val gcd: int -> int -> int
    
  • 作为一个取整数的函数,并返回一个函数,该函数取整数并返回一个整数。

     val gcd: int -> (int -> int)
    

这两种符号都是等价的(箭头&#34;运算符&#34;据说在右边是关联的),但第二种符号有助于理解函数返回的概念&#34;链接&#34;。 / p>

答案 2 :(得分:0)

在int - &gt; int - &gt; INT:

  • 最后一个int是返回值
  • 前两个整数是参数

Consider reading this了解函数类型。