Каково различие между функторами и “дженериками”

Вы могли посмотреть на использование Компаса обертка выше lucene.

http://www.compass-project.org/

Путем добавления нескольких аннотаций к объектам области, которые Вы получаете, достигает такого рода вещи.

Компас обеспечивает простой API для работы с Lucene. Если Вы будете знать, как использовать ORM, то Вы будете чувствовать себя хорошо дома с Компасом с простыми операциями для сохранения, и удалять & запрос.

От самого сайта. "При Создании сверху Lucene Компас упрощает шаблоны общего использования Lucene, такие как поиск стиля Google, индексные обновления, а также более усовершенствованные понятия, такие как кэширование и индекс sharding (sub индексы). Компас также использует созданный в оптимизации для параллельных фиксаций и слияний".

я использовал это в прошлом, и я нахожу его большим.

14
задан Elazar Leibovich 25 September 2009 в 06:46
поделиться

3 ответа

Но так ли это? Функторы просто дженерики, применяемые к пространствам имен?

Да, я думаю, что можно рассматривать функторы как «пространства имен с дженериками», и это само по себе было бы очень приветствуемым в C ++, где остается единственный вариант - использовать классы со всеми статические члены, которые скоро станут довольно уродливыми. По сравнению с шаблонами C ++ одним огромным преимуществом является явная подпись для параметров модуля (это то, чем, я считаю, могут стать концепции C ++ 0x, но упс ).

Также модули сильно отличаются от пространств имен (учитывайте множественные структурные сигнатуры, абстрактные и частные типы).

Даже если функторы просто generics-for-namespace, what's the significant advantage of that approach? Classes can also be used as ad-hoc namespaces using nested classes.

Not sure whether it qualifies for significant, but namespaces can be opened, while class usage is explicitly qualified.

All in all - I think there is no obvious "significant advantage" of functors alone, it is just different approach to code modularization - ML style - and it fits nicely with the core language. Not sure whether comparing module system apart from the language makes much sense.

PS C++ templates and C# generics are also quite different so that comparing against them as a whole feels little strange.

6
ответ дан 1 December 2019 в 14:33
поделиться

Я только что нашел источник, который может помочь вам с вашей проблемой - поскольку OCaml имеет другое значение для функторов:

http://books.google.de/books?id=lfTv3iU0p8sC&pg = PA160 & lpg = PA160 & dq = ocaml + functor & source = bl & ots = vu0sdIB3ja & sig = OhGGcBdaIUR-3-UU05W1VoXQPKc & hl = de & ei = u2e8SqqCNI7R & ei = u2e8SqqCNI7R & Qa43_fresi & amp; сбивает с толку, если одно и то же слово используется для разных концепций.


Я не знаю, имеет ли OCaml другое значение, но обычно Functor - это «объект функции» (см. здесь: http: //en.wikipedia .org / wiki / Function_object ). Это полностью отличается от дженериков (см. Здесь: http: //en.wikipedia. org / wiki / Generic_programming )

Функциональный объект - это объект, который может использоваться как функция. Обобщения - это способ параметризации объектов. Дженерики в некотором роде ортогональны наследованию (которое специализируется на объектах). Дженерики обеспечивают безопасность типов и уменьшают потребность в приведении типов. Функторы - это улучшенный указатель на функцию.

1
ответ дан 1 December 2019 в 14:33
поделиться

Если я правильно понимаю, функтор предоставляет вам новый набор функций из типа, который вы предоставляете

В более общем смысле, функторы отображают модули в модули. В вашем примере Set модуль, придерживающийся сигнатуры ORDERED_TYPE , отображается на модуль, реализующий набор. Подпись ORDERED_TYPE требует типа и функции сравнения. Следовательно, ваш C # не эквивалентен, потому что он параметризует набор только по типу, а не по функции сравнения. Таким образом, ваш C # может реализовывать только один тип набора для каждого типа элемента, тогда как функтор может реализовывать множество модулей набора для каждого модуля элемента, например, в порядке возрастания и убывания.

Даже если функторы являются просто универсальными пространствами имен, что? Значительное преимущество такого подхода?

Одним из основных преимуществ модульной системы более высокого порядка является возможность постепенного улучшения интерфейсов. В ООП все является публичным или частным (или иногда защищенным или внутренним и т. Д.). С модулями вы можете постепенно улучшать сигнатуры модулей по желанию, предоставляя больший публичный доступ ближе к внутренним компонентам модуля и абстрагируя его все больше и больше по мере того, как вы удаляетесь от этой части кода. Я считаю, что это существенное преимущество.

Два примера, в которых модульные системы более высокого порядка блистают по сравнению с ООП, - это параметризация реализаций структур данных друг над другом и создание расширяемых библиотек графов. См. Раздел «Структурная абстракция» в диссертации Криса Окасаки , где приведены примеры структур данных, параметризованных по сравнению с другими структурами данных, например функтор, преобразующий очередь в подключаемый список. См. Превосходную библиотеку ocamlgraph от OCaml и статью Проектирование универсальной библиотеки графов с использованием функторов ML , где приведены примеры расширяемых и многократно используемых алгоритмов графов с использованием функторов.

Классы также могут использоваться как специальные пространства имен с использованием вложенных классов .

В C # нельзя параметризовать классы по сравнению с другими классами. В C ++ вы можете делать некоторые вещи, например наследование от класса, переданного через шаблон.

Кроме того, вы можете каррировать функторы.

В C # нельзя параметризовать классы по сравнению с другими классами. В C ++ вы можете делать некоторые вещи, например наследование от класса, переданного через шаблон.

Кроме того, вы можете каррировать функторы.

В C # нельзя параметризовать классы по сравнению с другими классами. В C ++ вы можете делать некоторые вещи, например наследование от класса, переданного через шаблон.

Кроме того, вы можете каррировать функторы.

4
ответ дан 1 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: