ocaml - 绝对值函数 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_val
VisualStudio 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
我是不是更近了?
解决方案
您的语法错误是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 指出的那样,函数的返回值存在第二个问题。return
OCaml 中没有用于返回函数值的特殊关键字。OCaml 中的函数只是一组嵌套的函数调用,函数的值就是最外层调用返回的值。
推荐阅读
- python - 有没有更好的算法来比较每个图像与文件夹中的其他图像?
- r - 如何在R中的计数ggplot条形图中添加一个变量的百分比
- google-cloud-platform - GPU配额更新需要多少时间?
- c++ - 带有静态库的 SFML 编译错误。C++
- git - Git rebase 自动从分支中删除文件
- mysql - mysql窗口函数带case
- reporting-services - SSRS 报告将行排列到列
- html - 打开 .html 文件时 SVG 不显示
- git - 如何使用 git cherry-pick 跳过不精确的重命名检测
- sql - SQL中如何根据查询结果进行子查询