Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Альтернативы
Недавние
Show all languages
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

Из Википедии — свободной энциклопедии

Дефункционализация в программировании — техника преобразования программы на этапе компиляции, заменяющая функции высшего порядка на вызов одной-единственной функции применения функции к аргументу.

Впервые была описана Джоном Рейнольдсом (англ. John C. Reynolds) в 1972 году[1]. Поскольку всякая программа содержит конечное количество функциональных абстракций, то каждая из них может быть заменена уникальным идентификатором, а каждое применение абстрактной функции в такой программе может быть заменено вызовом функции функции применения с идентификатором абстрактной функции в качестве первого параметра. При этом функция применения выбирает по идентификатору абстрактной функции операции и выполняет их над оставшимися аргументами (исходными аргументами абстрактной функции).

Одним из затруднений для этой техники является то, что функциональная абстракция может ссылаться на свободные переменные. В такой ситуации до выполнения дефункционализации должен быть выполнен λ-подъём[англ.] — преобразование свободных переменных в замыкания, — чтобы любая свободная переменная, использующаяся функциональной абстракцией, передавалась бы в качестве аргумента в функцию применения. Кроме того, если замывание поддерживается в качестве значения первого класса, то необходимо обеспечить создание новых структур данных для представления захваченных значений.

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

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

Энциклопедичный YouTube

  • 1/3
    Просмотров:
    20 648
    5 087
    10 309
  • Борис Жуков: "Эволюционные ловушки"
  • Bartosz Milewski – Replacing functions with data
  • The Best Refactoring You’ve Never Heard Of

Субтитры

Пример

Для типа данных «дерево»[2]:

data Tree a = Leaf a
            | Node (Tree a) (Tree a)

производится дефункционализация следующей программы:

cons :: a -> [a] -> [a]
cons x xs = x : xs

o :: (b -> c) -> (a -> b) -> a -> c
o f g x = f (g x)

flatten :: Tree t -> [t]
flatten t = walk t []

walk :: Tree t -> [t] -> [t]
walk (Leaf x)     = cons x
walk (Node t1 t2) = o (walk t1) (walk t2)

Для этого осуществляется замена всех функций высшего порядка (cons, o, и walk) значением типа Lam, и вместо прямого вызова функций, используется функция apply, обрабатывающая значения этого типа:

data Lam a = LamCons a
           | LamO (Lam a) (Lam a)

apply :: Lam a -> [a] -> [a]
apply (LamCons x)  xs = x : xs
apply (LamO f1 f2) xs = apply f1 (apply f2 xs)

cons_def :: a -> Lam a
cons_def x  = LamCons x

o_def :: Lam a -> Lam a -> Lam a
o_def f1 f2 = LamO f1 f2

flatten_def :: Tree t -> [t]
flatten_def t = apply (walk_def t) []

walk_def :: Tree t -> Lam t
walk_def (Leaf x)     = cons_def x
walk_def (Node t1 t2) = o_def (walk_def t1) (walk_def t2)

Примечания

  1. Рейнольдс, 1972.
  2. Пример Оливера Данви, переведённый на Haskell

Литература

Ссылки

Эта страница в последний раз была отредактирована 26 июня 2021 в 20:51.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).