【问题标题】:Absolute value function Ocaml绝对值函数 Ocaml
【发布时间】:2020-06-20 10:34:25
【问题描述】:

我正在研究这种编程语言“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 的新手,所以我不知道这是否常见,但对我来说听起来好像缺少什么,可能是:)

附: : 我知道一个 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


    【解决方案1】:

    有时会发生语法错误不在此处而是在上方。您是否使用 ;; 关闭了之前的功能? ?另外,这是什么回报?使用语言的功能范式。您使用变量和引用并强制进行类型检查。我不确定你想如何使用这段代码,但一般来说,试着让 OCaml 确定你的函数的类型,而不是告诉编译器签名是什么。另外,您的代码不应该使用那么多引用。例如以下:

    let abs_val value = 
      if value < 0 then
        -value
      else
        value
    

    将完美地工作,不会弄乱参考。如果您希望使用引用,我建议您在深入了解 OCaml 的命令式可能性之前先了解更多关于 OCaml 的函数式范例。

    【讨论】:

    • 我知道我没有按照我应该使用的语言使用这种语言,但我正在努力学习如何定义、使用...代码都在这里,我写了一切。
    【解决方案2】:

    您的语法错误是因为 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 所指出的,您的函数的返回值存在第二个问题。 OCaml 中没有特殊的return 关键字用于返回函数的值。 OCaml中的一个函数只是一组嵌套的函数调用,函数的值就是最外层调用返回的值。

    【讨论】:

      猜你喜欢
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2017-03-04
      • 2012-10-17
      相关资源
      最近更新 更多