Вы могли посмотреть на использование Компаса обертка выше lucene.
http://www.compass-project.org/
Путем добавления нескольких аннотаций к объектам области, которые Вы получаете, достигает такого рода вещи.
Компас обеспечивает простой API для работы с Lucene. Если Вы будете знать, как использовать ORM, то Вы будете чувствовать себя хорошо дома с Компасом с простыми операциями для сохранения, и удалять & запрос.
От самого сайта. "При Создании сверху Lucene Компас упрощает шаблоны общего использования Lucene, такие как поиск стиля Google, индексные обновления, а также более усовершенствованные понятия, такие как кэширование и индекс sharding (sub индексы). Компас также использует созданный в оптимизации для параллельных фиксаций и слияний".
я использовал это в прошлом, и я нахожу его большим.
Но так ли это? Функторы просто дженерики, применяемые к пространствам имен?
Да, я думаю, что можно рассматривать функторы как «пространства имен с дженериками», и это само по себе было бы очень приветствуемым в 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.
Я только что нашел источник, который может помочь вам с вашей проблемой - поскольку OCaml имеет другое значение для функторов:
Я не знаю, имеет ли OCaml другое значение, но обычно Functor - это «объект функции» (см. здесь: http: //en.wikipedia .org / wiki / Function_object ). Это полностью отличается от дженериков (см. Здесь: http: //en.wikipedia. org / wiki / Generic_programming )
Функциональный объект - это объект, который может использоваться как функция. Обобщения - это способ параметризации объектов. Дженерики в некотором роде ортогональны наследованию (которое специализируется на объектах). Дженерики обеспечивают безопасность типов и уменьшают потребность в приведении типов. Функторы - это улучшенный указатель на функцию.
Если я правильно понимаю, функтор предоставляет вам новый набор функций из типа, который вы предоставляете
В более общем смысле, функторы отображают модули в модули. В вашем примере Set
модуль, придерживающийся сигнатуры ORDERED_TYPE
, отображается на модуль, реализующий набор. Подпись ORDERED_TYPE
требует типа и функции сравнения. Следовательно, ваш C # не эквивалентен, потому что он параметризует набор только по типу, а не по функции сравнения. Таким образом, ваш C # может реализовывать только один тип набора для каждого типа элемента, тогда как функтор может реализовывать множество модулей набора для каждого модуля элемента, например, в порядке возрастания и убывания.
Даже если функторы являются просто универсальными пространствами имен, что? Значительное преимущество такого подхода?
Одним из основных преимуществ модульной системы более высокого порядка является возможность постепенного улучшения интерфейсов. В ООП все является публичным или частным (или иногда защищенным или внутренним и т. Д.). С модулями вы можете постепенно улучшать сигнатуры модулей по желанию, предоставляя больший публичный доступ ближе к внутренним компонентам модуля и абстрагируя его все больше и больше по мере того, как вы удаляетесь от этой части кода. Я считаю, что это существенное преимущество.
Два примера, в которых модульные системы более высокого порядка блистают по сравнению с ООП, - это параметризация реализаций структур данных друг над другом и создание расширяемых библиотек графов. См. Раздел «Структурная абстракция» в диссертации Криса Окасаки , где приведены примеры структур данных, параметризованных по сравнению с другими структурами данных, например функтор, преобразующий очередь в подключаемый список. См. Превосходную библиотеку ocamlgraph от OCaml и статью Проектирование универсальной библиотеки графов с использованием функторов ML , где приведены примеры расширяемых и многократно используемых алгоритмов графов с использованием функторов.
Классы также могут использоваться как специальные пространства имен с использованием вложенных классов .
В C # нельзя параметризовать классы по сравнению с другими классами. В C ++ вы можете делать некоторые вещи, например наследование от класса, переданного через шаблон.
Кроме того, вы можете каррировать функторы.
В C # нельзя параметризовать классы по сравнению с другими классами. В C ++ вы можете делать некоторые вещи, например наследование от класса, переданного через шаблон.
Кроме того, вы можете каррировать функторы.
В C # нельзя параметризовать классы по сравнению с другими классами. В C ++ вы можете делать некоторые вещи, например наследование от класса, переданного через шаблон.
Кроме того, вы можете каррировать функторы.