Что означают "reify" и "reification" в контексте (функционального?) Программирования?
Я много читал этот термин в блогах о haskell и функциональном программировании (особенно в sigfpe blog), но я не имею понятия о что это значит. Я избегаю этого, не зная об этом в большинстве случаев, но я, вероятно, понял бы тексты намного лучше, если бы знал. Google не помог мне. Я теряюсь в технических вещах.
Кроме того, нетехнический смысл мира ( "превращение абстрактного бетона" ) не помогает мне понять, что это фактически означает что-то подтвердить в коде.
Я немного замешан с концепциями компьютерной науки, поэтому практические примеры с кодом были бы хороши.: P
Ответы
Ответ 1
Итак, я прочитал об этом, и это в значительной степени то, что это означает: принятие абстрактной концепции и ее конкретного. Или, есть прокси, представляющий абстрактную концепцию. Например, в Lisp понятие абстракции и приложения процедуры подтверждается при использовании лямбда.
Обоснование само по себе является широкой концепцией, а не только применимой к функциональным языкам программирования.
В Java, например, существуют типы, доступные во время выполнения. Это повторяющиеся типы. Смысл, существует конкретное представление абстрактного понятия типа во время выполнения. Напротив, существуют невосстанавливаемые типы. Это особенно заметно при использовании дженериков в Java. В Java дженерики подвержены стиранию типа, поэтому общая информация типа недоступна во время выполнения (если только в параметризованном типе не используются неограниченные подстановочные знаки).
Другим примером является попытка моделирования модели. Например, предположим, что у вас класс Group
и класс User
. Теперь есть некоторые абстрактные понятия, описывающие взаимосвязь между ними. Например, абстрактное понятие a User
является членом a Group
. Чтобы сделать эти отношения конкретными, вы должны написать метод под названием isMemberOf
, который говорит, является ли User
членом Group
. Итак, вы сделали здесь, что у вас reified (сделана реальная/явная/конкретная) абстрактная концепция членства в группе.
Другим хорошим примером является база данных, в которой у вас есть отношения между родителями и дочерними объектами. Вы можете описать эту взаимосвязь в абстрактном понятии дерева. Теперь предположим, что у вас есть функция/метод, который берет эти данные из базы данных и создает фактический объект Tree
. Теперь вы сделали reified абстрактную концепцию древовидного отношения родитель-ребенок к фактическому Tree
объекту.
Возвращаясь к функциональным языкам вообще, возможно, лучшим примером овеществления является создание самого языка программирования Lisp. Lisp был полностью абстрактной и теоретической конструкцией (в основном просто математической нотации для компьютерных языков). Это оставалось таким образом, пока функция Lisp eval
фактически была реализована Стивом Расселом на IBM 704:
Согласно тому, что сообщил Пол Грэм в "Хакеры и художники", с. 185, Маккарти сказал: "Стив Рассел сказал, смотри, почему я не программирую эту оценку... и я сказал ему: хо-хо, ты запутываешь теорию с практикой, эта оценка предназначена для чтения, а не для вычисления, но он пошел дальше и сделал это. То есть, он собрал eval в моей статье в машинный код IBM 704, исправил ошибку, а затем рекламировал это как интерпретатор Lisp, который, безусловно, был. Lisp имел по существу форму, которую он имеет сегодня..."
Итак, Lisp был reified из абстрактного понятия, в настоящий язык программирования.
Ответ 2
Конкретизация
Обоснование - это форма инстанцирования. Когда вы воссоединяете концепцию, вы берете что-то абстрактное и делаете его конкретным, точно так же, как и определение словаря, которое вы предоставили.
Возможно, вы захотите подтвердить тип как термин, в котором содержится некоторое абстрактное синтаксическое дерево возможных типов.
Вы можете воссоздать шаблон дизайна, придумав для него реализацию общего назначения для некоторого языка. Например, что-то вроде
template<typename T> class Singleton {
public:
static T& Instance() {
static T me;
return me;
}
protected:
virtual ~Singleton() {};
Singleton() {};
}
подтверждает шаблон дизайна singleton как шаблон в С++.
Вы можете воссоздать идею Hoare о быстрой сортировке в реализацию на выбранном вами языке программирования. В этом ключе я трачу много времени на то, чтобы перевести понятия из теории категорий в код Haskell.
Вы можете подтвердить язык как интерпретатор для этого языка. Идея Larry Wall о Perl, язык охарактеризован как интерпретатор perl.
data-reify и vacuum пакеты reify terms как графики, представляющие, как он структурирован в памяти при совместном использовании.
Отражение
Отражающая сторона овеществления - это отражение, которое принимает что-то конкретное и генерирует абстракцию, как правило, забывая некоторые детали. Возможно, вы хотите сделать это, потому что абстракция проще или каким-то образом отражает суть того, о чем вы говорите.
Отражение системы типов в Java, С# и т.д. берет конкретный класс на языке программирования и предоставляет вам абстрактную структуру класса, предоставляя вам доступ к списку того, что предоставляют члены вашего класса. Здесь мы берем конкретное понятие типа и генерируем из него абстрактный термин, который описывает его структуру, отбрасывая любые конкретные значения.
Как то, как вы можете подтвердить язык программирования в реализации, вы можете несколько раз идти в обратном направлении. Хотя это обычно считается плохой идеей, вы можете взять реализацию и попытаться отразить спецификацию языка от желаемых свойств своего поведения. TeX был реализован сначала по спецификации Knuth, sans. Любая спецификация TeX была отражена в реализации Knuth.
(Более формально, если вы рассматриваете отражение как забывчивый функтор, который выводит вас из конкретной области в абстрактный домен, тогда овеществление, в идеале, левое сопряжено с отражением.)
Пакет reflection, который я поддерживаю, предоставляет метод reify, который принимает термин и дает тип, который представляет его, а затем метод отражения, который позволяет генерировать новый термин. Здесь "конкретный" домен - это система типов, а абстрактный домен - это термины.
Ответ 3
Из Haskell Wiki:
Чтобы "реанимировать", нужно что-то предпринять что-то абстрактное и это как материал. Классическим примером является путь, который принимали древние абстрактные понятия (например, "победа" ) и превратили их в божеств (например, Nike, греческая богиня победы).
Тип reified - это значение, которое представляет собой тип. Использование типов reified вместо реальных типов означает, что вы могут делать с ними какие-либо манипуляции что вы можете делать со значениями.
Ответ 4
Одно использование, о котором я могу думать (я уверен, что есть другие!) превращает класс в словарь. Возьмем класс Eq
(на данный момент забываем об операторе /=
):
class Eq a where
(==) :: a -> a -> Bool
Если мы reify этот класс, он становится:
data EqDict a = EqDict (a -> a -> Bool)
которые могут быть построены, проверены и так далее. Также следует отметить, что вы можете иметь только один экземпляр Eq
для каждого типа, но несколько значений EqDict
. Но автоматическое построение экземпляров (например, получение равенства для списков, когда у вас есть для элементов) не работает; вам нужно будет построить значение EqDict [a]
самостоятельно.
Процесс остывания такой же простой, как и этот (для этого случая):
reify :: Eq a => EqDict a
reify = EqDict (==)
Функция, использующая класс Eq
, может преобразовать что-то вроде этого:
-- silly example, doesn't really do anything
findMatches :: Eq a => a -> [a] -> [a]
findMatches x ys = [ y | y <- ys, x == y ]
-- version using EqDict
findMatchesDict :: EqDict a -> a -> [a] -> [a]
findMatchesDict (EqDict f) x ys = [ y | y <- ys, f x y ]
Если вы разворачиваете EqDict и просто проходите a -> a -> Bool
, вы получаете функции ..By
, такие как Data.List.nubBy
и друзья. Подобный трюк для Ord
приводит к Data.List.sortBy
.
Ответ 5
Даже в контексте Haskell термин используется очень широко. Пакет средств поддержки Andy Gill позволяет вам принимать рекурсивные структуры и превращать их в явные графики. Сообщение Sigpfe в продолжениях описывает, как понятие "остальная часть вычисления" означает значение, которое вы можете пройти. Шаблон Haskell имеет функцию reify (выполненную вместе с TH-кодом в общем случае во время компиляции), которая при задании имени значения Haskell возвращает доступную ему информацию (где объявлено, тип и т.д.).
Что общего у всех этих случаев? Они говорят о принятии чего-то, о чем мы можем рассуждать и знать, но которое мы не можем напрямую программно манипулировать, и превращая его в фактическое значение первого класса, которое мы можем назвать и передать так же, как и любой другой. И это вообще намерение, которое люди хотят передать, когда они используют это слово.
Ответ 6
Я знаю там понятие овеществления в RDF. Как о котором говорил Тим Бернес-Ли:
Обоснование в этом контексте означает выражение чего-либо на языке с использованием языка, так что он становится поддающимся лечению языком.
Я предполагаю, что это похоже на отражение или интроспекцию. Надеюсь, вы получите здесь хорошие ответы!