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”,但语法错误?)
任何人都可以提供帮助? THX
答案 0 :(得分:3)
要解决语法错误,你必须像这样写(你错过了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
x
和f x
中的let x = 15
与函数中的x无关,最内层范围内的x
优先(这称为阴影)