2013-05-28 2 views
1
let x = 132;; 
let f x = 
    let x = 15 in (fun x -> print_int x) 150;; 
f 2;; 

Выход 150.OCaml Синтаксис среды и Синтаксис Error

Мой вопрос: почему "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», но синтаксическую ошибку?)

Любой может помочь? ТНХ

ответ

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 в сокровенной сфере принимает preceden ce (это называется затенением).

+0

Thx, отличная помощь! – user2170674

Смежные вопросы