Что означают «reify» и «reification» в контексте (функционального?) Программирования? - PullRequest
76 голосов
/ 15 марта 2011

Я много читал этот термин в блогах о haskell и функциональном программировании (особенно в блоге sigfpe ), но я понятия не имею, что он означает.Большую часть времени мне не нравится это, но, наверное, я бы понял тексты намного лучше, если бы знал.Google не помог мне.Я заблудился в технических вещах.

Также нетехническое значение мира («превращение абстрактного бетона») не помогает мне понять, что на самом деле означает что-то в коде.с понятиями информатики, так что практические примеры с кодом были бы хороши.: P

Ответы [ 6 ]

36 голосов
/ 15 марта 2011

Итак, я прочитал об этом, и это почти то, что это значит: взять абстрактную концепцию и сделать ее конкретной.Или есть прокси, который представляет абстрактную концепцию.Например, в Лиспе концепция абстракции и применения процедуры претворяется в жизнь при использовании лямбда-выражений.

Реализация сама по себе является широкой концепцией и не только применима к функциональным языкам программирования.

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

Другой пример - попытка смоделировать концепцию.Например, предположим, что у вас есть класс Group и класс User.Теперь есть определенные абстрактные понятия, которые описывают отношения между ними.Например, абстрактная концепция User является членом Group.Чтобы конкретизировать эти отношения, вы должны написать метод с именем isMemberOf, который сообщает, является ли User членом Group.Итак, что вы сделали здесь, так это то, что у вас есть reified (сделано реальным / явным / конкретным) абстрактное понятие членства в группах.

Другой хороший пример - этобаза данных, где у вас есть родительские и дочерние отношения между объектами.Вы можете описать это отношение в абстрактном понятии дерева.Теперь предположим, что у вас есть функция / метод, который берет эти данные из базы данных и создает объект фактический Tree.Теперь вы сделали reified абстрактную концепцию древовидных отношений родитель-потомок в фактический Tree объект.

Возвращение к функционалуЯзыки в целом, пожалуй, лучший пример реализации - создание самого языка программирования Lisp.Лисп был полностью абстрактной и теоретической конструкцией (в основном просто математическая запись для компьютерных языков).Так продолжалось до тех пор, пока функция Lisp eval не была фактически реализована Стивом Расселом в IBM 704:

Согласно тому, что сообщил Пол Грэм в Hackers & Painters, p.185, Маккарти сказал: «Стив Рассел сказал, смотри, почему бы мне не запрограммировать этот eval ..., и я сказал ему, хо-хо, ты путаешь теорию с практикой, этот eval предназначен для чтения, а недля вычислений. Но он пошел вперед и сделал это. То есть он скомпилировал eval в моей статье в машинный код IBM 704, исправляя ошибку, а затем объявил об этом как интерпретатор Lisp, что, безусловно, и было.по сути, форма, которую он имеет сегодня ... "

Итак, Лисп был преобразован из абстрактной концепции в реальный язык программирования.

23 голосов
/ 15 марта 2011

Конкретизация

Реификация - это форма воплощения. Когда вы изменяете концепцию, вы берете что-то абстрактное и конкретизируете его, точно так же, как и приведенное вами определение словаря.

Вы можете выбрать изменение типа в качестве термина, в котором содержится некое абстрактное синтаксическое дерево возможных типов.

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

template<typename T> class Singleton {
    public:
        static T& Instance() {
            static T me;
            return me;
        }

    protected:
       virtual ~Singleton() {};
       Singleton() {};
}

превращает шаблон проектирования Singleton в шаблон C ++.

Вы можете преобразовать идею Хоара о быстрой сортировке в реализацию на языке программирования по вашему выбору. В этом ключе я трачу много времени на преобразование понятий из теории категорий в код на Haskell.

Вы можете использовать язык в качестве переводчика для этого языка. Идея Ларри Уолла о Perl языке утончается как интерпретатор perl.

Пакеты data-reify и вакуумированные преобразовывают термины в виде графиков, представляющих его структуру в памяти с совместным использованием.

Отражение

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

Отражение системы типов в Java, C # и т. Д. Берет конкретный класс на языке программирования и предоставляет вам абстрактную структуру класса, предоставляя вам доступ к списку членов, которые предоставляют ваши классы. Здесь мы берем конкретное понятие типа и генерируем из него абстрактный термин, который описывает его структуру, отбрасывая при этом любые конкретные значения.

Подобно тому, как вы можете преобразовать язык программирования в реализацию, вы можете иногда идти в противоположном направлении. Хотя обычно это считается плохой идеей, вы можете взять реализацию и попытаться отразить спецификацию языка из желательных свойств его поведения. TeX был впервые реализован по спецификации Кнута. Любая спецификация TeX была отражена в реализации Кнута.

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

Пакет рефлекса , который я поддерживаю, предоставляет метод reify, который берет термин и возвращает тип, который его представляет, а затем метод рефлекса, который позволяет генерировать новый термин. Здесь «конкретный» домен - это система типов, а абстрактный домен - это термины.

21 голосов
/ 15 марта 2011

Из Haskell Wiki :

Чтобы «овеществить» что-то, нужно взять что-то абстрактное и считать его материальным.Классическим примером является способ, которым древние люди брали абстрактные понятия (например, «победа») и превращали их в божества (например, Nike, греческая богиня победы).

Реализованный тип - это значение, представляющее тип,Использование преобразованных типов вместо реальных типов означает, что вы можете делать с ними любые манипуляции, которые вы можете делать со значениями.

14 голосов
/ 15 марта 2011

Одно из возможных применений (я уверен, что есть и другие!) - это превращение класса в словарь. Давайте возьмем класс Eq (на данный момент забывая об операторе /=):

class Eq a where
    (==) :: a -> a -> Bool

Если мы утвердим этот класс, он станет:

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.

9 голосов
/ 15 марта 2011

Даже в контексте Haskell этот термин используется очень широко.Пакет reify Энди Гилла позволяет вам брать рекурсивные структуры и превращать их в явные графы.Пост Sigpfe о продолжениях описывает превращение понятия «остальная часть вычислений» в значение, которое вы можете передать.Шаблон Haskell имеет функцию reify (которая выполняется вместе с кодом TH в целом во время компиляции), которая при присвоении имени значению Haskell возвращает доступную информацию о нем (где он объявлен, указан тип и т.Что общего у всех этих случаев?Они говорят о том, чтобы взять что-то, о чем мы можем рассуждать и знать, но которым мы не можем напрямую программно манипулировать, и превращать это в реальное первоклассное значение, которое мы можем назвать и передать, как и любое другое.И это обычно намерение, которое люди хотят передать, когда они используют слово.

2 голосов
/ 15 марта 2011

Я знаю, что в RDF есть концепция овеществления. Как заявлено Тимом Бернес-Ли :

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

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

...