2013-04-08 6 views
1

I ran across this statementЕсть поддержка для «крючков» в OCaml?

«Я заметил, программисты хххх склонны к чрезмерному наследования, возможно потому, что это единственный разумный способ расширения кода в на этом языке. Гораздо лучше и более общий способ расширить код обычно использовать крючки (см. API-интерфейс Apache, [см. Drupal я мог бы добавить]). "

Некоторое время искал термин «крючок», повторяемый в других документах OCaml.

Есть ли поддержка для этого в OCaml? Направьте меня в правильном направлении. Я хочу, чтобы какой-то класс, оставшийся (все экземпляры) управляемый и вызываемый, или даже не мог, каким-то образом может реализовать модуль?

Спасибо!

+1

Кажется, что «крючок» здесь может иметь множество различных потенциальных определений. – aneccodeal

ответ

3

Я бы воспринял это как личное мнение автора учебника. Крючки не являются частью дизайна объекта OCaml. (В моем экспромтом личного мнения, крючки гораздо, гораздо хуже, чем наследование.)

0

Описание крючка в Apache documentation является:

В общем, функция крючок один, что Apache будет вызывать в какой-то момент во время обработки запроса. Модули могут предоставлять функции, которые вызывают, и указывать, когда они вызываются по сравнению с другими модулями.

Более общим термином будет функция обратного вызова; такие языки, как C#, имеют специальные объекты обратного вызова Делегаты, потому что они не рассматривают функции как (хорошие) граждане первого класса на своем языке. В функциональных языках, таких как OCaml, функции ничем не отличаются от других значений, поэтому вы можете передавать их так же, как любое целочисленное значение, не требуя указателей или тому подобного. Это делает запись функций обратного вызова на этих языках настолько естественной, что их программистам даже не нужно причудливое имя для этого. ;)

На самом деле стандартная библиотека OCaml имеет множество функций более высокого порядка, которые принимают другие функции в качестве аргументов. Ниже приведен пример:

List.iter print_endline ["higher"; "order"; "function"] 

List.iter функция принимает функцию print_endline, как «обратного вызова» аргумент и применяет его к каждому элементу 2-го аргумента (список строк). Поскольку OCaml позволяет функциям иметь побочные эффекты, вы можете даже снабдить funciton до List.iter, который изменяет некоторые ссылки в другом месте вашей программы.

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