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
和noterror:this expression具有类型(…),但表达式应为类型(…)
。因此我感到困惑。哦,没关系:语法错误可能来自val
行。我以为列表是从交互式会话中获取的,而不是文件的实际内容。
val gcd: int -> (int -> int)