OCaml中的GCD(初学者)

OCaml中的GCD(初学者),ocaml,greatest-common-divisor,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 ;; 还有,谁能给我解释一下“int->int->int=”是什么意思?我知道这一定是关于函数的参数和返回值的,但是什么和如何呢?:) 您正在将gcd55和200作为prin

我想写一段简单的代码:

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 ;;

还有,谁能给我解释一下“int->int->int=”是什么意思?我知道这一定是关于函数的参数和返回值的,但是什么和如何呢?:)

您正在将
gcd
55
200
作为
printf
的单独参数传递。那么,试试这个:

Printf.printf "%d da\n" (gcd 55 200);;
在int->int->int中:

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

理解函数类型。

看起来您从ocaml交互会话中进行了一些复制和粘贴,因为通常我们不会混淆函数定义(前两行)和函数声明(第三行,尽管在本例中,它看起来更像是ocaml解释器在提供定义时的答案-因为
部分在程序中语法不正确,但解释器使用它来表示它计算出值是一个函数)位于同一范围内

因此,您不应该包括第三行,您必须修复最后一条指令,正如@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个整数参数组成的序列,并返回一个整数。该符号称为货币形式:传递给函数a的每个参数产生另一个函数B,该函数B期望a的其余参数。因此,您可以通过多种方式读取该签名:

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

    val gcd: int -> int -> int
    
  • 作为一个函数,接受一个整数并返回一个a函数,它接受一个整数并返回一个整数

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

这两种符号是等价的(箭头“操作符”在右边被称为是关联的),但第二种符号有助于理解函数返回“链接”的概念问题。这正是我所说的。但是如果你阅读原始帖子,OCaml报告的错误是
文件“tst.ml”,第3行,字符0-3:error:Syntax error
和not
error:this expression具有类型(…),但表达式应为类型(…)
。因此我感到困惑。哦,没关系:语法错误可能来自
val
行。我以为列表是从交互式会话中获取的,而不是文件的实际内容。
 val gcd: int -> (int -> int)