Вот код из книги «Компиляция с продолжениями», стр. 16 (переписываю f#):
let (x,y)=
let g(a,b:int,c)=a+c in
(g,g(1,2,3))
Таким образом, x
может быть функцией g
, определенной в let.
Может быть, по грамматике мл это нормально, но в «инженерной практике» кажется, что функция, определенная в «впуске» функции, или где и пусть в Хаскеле, она должна быть «приватной», как язык о-о, она должна быть "функцией инструмента", используемой в функции.
Так пример кода правильный? Возможно, программа запустится, но я не думаю, что это хорошая практика; ml должен предотвратить это, например, используя «private».
Функция в OCaml — это значение первого класса. Нет проблем с возвратом функции из функции.
Все прекрасно определено (по сути, это семантика лямбда-исчисления). Если рассматривать функцию как значение, она несет в себе необходимое окружение (т. е. является замыканием).
Лично я не вижу больше проблем с возвратом функции, чем с возвратом структуры данных. Если у вас есть опыт работы с OCaml, вы можете начать смотреть на это таким образом.
В дополнение к этому ответу я бы добавил еще одну вещь, которая, кажется, сбивает с толку op. переменные x
и y
уже находятся в области верхнего уровня, поэтому мы определяем функцию g во внутренней области let
и просто возвращаем эту функцию (здесь g
) как значение, которое должно быть ограничено верхним уровнем x
«Частная» защита, как и область действия, применяется к именам, а не к значениям. Вы должны быть в состоянии сделать то же самое на языке "OO", где функции являются "первоклассными" значениями.