1
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”,但语法错误?)

任何人都可以帮忙吗?谢谢

4

1 回答 1

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

xinf x与函数内的let x = 15x 无关,x最内层范围内的 the 优先(这称为遮蔽)。

于 2013-05-28T21:30:08.293 回答