syntax - OCaml语法环境和语法错误

标签 syntax syntax-error ocaml

let x = 132;;
let f x = 
    let x = 15 in (fun x -> print_int x) 150;;
f 2;;

输出为150。

我的问题是:为什么“print_int”还没有执行?是因为fun x-> print_int x仅定义了一个函数,但还不需要执行?内部功能仅打印15吗?

我想回应我的猜测,并在修改代码时对此:
# let x = 132;;
val x : int = 132
# let f x = 
  let x = 15 in (let g x = print_int x) 150;;
Error: Syntax error

提示错误。为什么?
(我只是想将函数命名为“g”,但是语法错误?)

有人可以帮忙吗?谢谢

最佳答案

要解决语法错误,您必须像这样编写它(您缺少in关键字和函数名称):

let f x =
let x = 15 in let g x = print_int x in g 150;;

要了解为什么要查看顶层第一个示例的类型:
# (fun x -> print_int x);; (* define a function *)
- : int -> unit = <fun>
# (fun x -> print_int x) 150;; (* define a function and call it with 150 *)
150- : unit = ()
# (let g x = print_int x);; (* define a value named 'g' that is a function , 'g' has the type below *)
val g : int -> unit = <fun>
# (let g x = print_int x) 150;; (* you can't do this, the code in the paranthesis is not a value: it is a let-binding or a definition of a value *)
Error: Syntax error
xf x中的let x = 15与函数内部的x无关,最内层作用域中的x优先(这称为阴影)。

关于syntax - OCaml语法环境和语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16801487/

相关文章:

android - Android上的Python 'invalid syntax'错误

javascript - Javascript响应 Uncaught SyntaxError : Unexpected token '<' or Syntax error

java - token ")"出现语法错误,此 token 后应有语句

ocaml - 如何在 ocaml 顶层检查模块/签名?

java - "Error during linking"表示用 Ocaml 编写的 Java 编译器

c# - C#中的对象实例化之间的区别:将对象存储在引用中与直接调用方法

c# - linq to xml 的 vb.net 三点语法

Java if 语句以分号结尾

parsing - 解析的优先级

syntax - 何时可以省略括号、点、大括号、=(函数)等,具体规则是什么?