Что означают "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. Как о котором говорил Тим Бернес-Ли:

Обоснование в этом контексте означает выражение чего-либо на языке с использованием языка, так что он становится поддающимся лечению языком.

Я предполагаю, что это похоже на отражение или интроспекцию. Надеюсь, вы получите здесь хорошие ответы!