Синтаксическая путаница в OCaml - PullRequest
0 голосов
/ 05 февраля 2019

Когда я впервые начал использовать выражение in, я подумал, что оно довольно простое и имеет смысл.Однако эти примеры кода заставили меня усомниться в том, насколько хорошо я их понимаю.

let fun1 x = let fun2 y = y + 1 in fun2(x);;
val fun1 : int -> int = <fun> 

Я думаю, это можно представить как объявление fun2, а затем применение его для вызова fun2 с переменной x, которую вы получаете.от fun1.

let sum1 i = let sum2 j = i+j in sum2;;
val sum1 : int -> int -> int = <fun> 

Этот смущает меня гораздо больше и вызывает больше вопросов.Я действительно не знаю, как это интерпретировать.Является ли sum1 объявленным для использования в sum2?Если да, то почему in применяется к внешней функции, а не к внутренней функции, как это было в первом примере?

Буду признателен за любую помощь в интерпретации этих фрагментов кода.

1 Ответ

0 голосов
/ 05 февраля 2019

Нет такого понятия, как in оператор.Существуют let определения формы let [rec] pattern = expression {and pattern = expression} и let выражения формы let [rec] pattern = expression {and pattern = expression} in expression (где [] означает «необязательный», а {} означает «ноль или более»).Таким образом, in является просто частью синтаксиса выражений let.

Является ли sum1 объявленным для использования в sum2?

Нет.sum2 определен для использования внутри sum1, как в вашем первом примере.sum1 i просто возвращает sum2 в качестве результата.Другой способ написать его без указания имени возвращаемой функции:

let sum1 i = fun j -> i + j

Или даже:

let sum1 i j = i + j
...