首页 > 解决方案 > 绝对值函数 Ocaml

问题描述

我正在研究这种编程语言“Ocaml”,但我遇到了一些麻烦,因为我阅读了官方的 ocaml 文档,但我不了解如何使用:

“;” 和 ”;;” 和“in”特别是在函数的定义中。

这是我的代码:

let abs_val value : int -> int =
  let abs_ret = ref 0 ;
  if value >= 0
  then abs_ret := value
  else abs_ret := -value ;
  let return : int = abs_ret
;;
print_int abs_val -12

用“ocamlc”编译它说:

File "first_program.ml", line 7, characters 2-4:
7 |   ;;
      ^^
Error: Syntax error

这对我来说听起来很奇怪,因为官方 ocaml 的文档说当函数定义结束时我必须使用“;;”。

我注意到在abs_valVisualStudio Code 的定义之后,当我换行时,会自动将光标放在右侧的 2 个空格上,而不是在行首。

我是 ocaml 的新手,所以我不知道这是否常见,但对我来说听起来好像缺少什么,可能是:)

PS:我知道一个 abs 函数已经存在,但我这样做是为了学习。

更新 :

let abs_val value =
let abs_ret = ref 0 in
if value >= 0
then  abs_ret := value 
else  abs_ret := -value in
let return : int = abs_ret;
;;
print_int abs_val -12

我是不是更近了?

标签: ocaml

解决方案


您的语法错误是let没有匹配的结果in

这是学习 OCaml 语法时非常常见的错误。OCaml中有两种不同的用法let。在模块的顶层,您用于let定义作为模块元素之一的符号(函数或值)。所以在下面:

 module M = struct
     let f x = x * 2
 end

let定义了一个名为 的函数M.f

同样,您的代码使用let这种方式来定义abs_val.

在其他情况下(不在模块的顶层),let仅用作let ... in表达式的一部分,如下所示:

 let v = exp1 in exp2

这实质上定义了一个局部变量v,其值exp1可以在exp2.

您对 的所有其他用途let(除了 的初始定义abs_val)都属于第二种。但是,它们都没有in,所以它们在语法上都是不正确的。

您需要先解决这些问题,然后才能使用此功能取得进展。您可以修复第一个问题,例如,将第一个分号 ( ;) 更改为in.

正如@SDAChess 指出的那样,函数的返回值存在第二个问题。returnOCaml 中没有用于返回函数值的特殊关键字。OCaml 中的函数只是一组嵌套的函数调用,函数的值就是最外层调用返回的值。


推荐阅读