2015-02-23 3 views
0

Я не уверен, как правильно пройти эту функцию и определить ее тип. Я набрал его на верхний уровень OCaml, и выход «hello world», но я не знаю, почему. Может кто-нибудь объяснить, как они определили конечный результат? Благодаря!Как эта функция действует в OCaml? Кроме того, как я буду проверять, являются ли такие утверждения, как этот, законными в будущем?

let f y = 
    let z = (let x = 5 in y * x) + y in "hello" in (f 7)^" world" 

ответ

2

Ну, все, что основано на OCaml построить let a = b in c. Если вы сопоставляете пары let и in, вы можете увидеть структуру выражения.

let f y = 
    let z = (let x = 5 in y * x) + y 
    in "hello" 
in (f 7)^" world" 

По существу f это функция, которая делает некоторые бесполезные вычисления затем возвращает «привет».

Update

Этот код имеет два несколько различных видов использования let a = b in c. Может быть, будет понятно объяснить их отдельно.

Следующая:

let y = expr1 in expr2 

определяет новое имя y со значением заданной expr. Затем имя y можно использовать в expr2.

Следующая:

let f x = expr1 in expr2 

определяет функцию f. Определение expr1 обычно использует аргумент x для вычисления интересного значения. Затем функцию f можно вызвать в expr2.

Ваш код имеет два экземпляра первой конструкции (определяющие значения z и x) и одну из второй конструкции (определяющую функцию f).

+0

Что делает ключевое слово «in»? Я новичок в ocaml, так что исправьте меня, если я ошибаюсь, но для меня ключевое слово «hello» воспринимается как начальный ввод функции z – AndroidNewbie

+0

. Ключевое слово 'in' соответствует предыдущему ключевому слову' let'. Нет функции 'z', z - просто значение. –

+0

Благодарим вас за разъяснения – AndroidNewbie

1

Эта функция специально запутанным, так что позволяет аккуратно двигаться по шагам сокращения:

let f y = 
    let z = (let x = 5 in y * x) + y in "hello" in (f 7)^" world" 

==> 

let f y = 
    let z = y * 5 + y in "hello" in (f 7)^" world" 

==> 

let f y = 
    let z = y * 5 + y in "hello" in (f 7)^" world" 

На данный момент очевидно, что z не используется в функции f, давайте удалим его:

let f y = "hello" in (f 7)^" world" 

Мы можем видеть, что на самом деле у нас есть «функция» f, которая всегда возвращает «привет»:

let f y = "hello" 

Это определено в области выражения (f 7)^" world". f 7 оценивается как "hello", и у нас есть "hello world".

let <name> = <expr-1> in <expr-2> 

имеет следующие правила оценки:

  1. оценки <expr-1>
  2. заменителя каждый свободные вхождения в <name><expr-2> с <expr-1>
  3. оценки <expr-2>