Що таке "зняте представництво"?


12

Щойно перебігли цей термін тут:

http://www.codemesh.io/codemesh2014/viktor-klang

"Ми продемонструємо API Flow - підняте представлення, а також підключається спосіб перетворення піднятого представлення в представлення виконання - Матеріалізація потоку."

Гуглінг не дуже допомагав.


рекомендуємо прочитати: Обговори це $ {blog}
gnat

11
@gnat здається, що він не вигадав цей термін, це не схоже на думку, це, швидше за все, не спровокує дискусію, і моє відчуття кишечника полягає в тому, що він не буде занадто широким (хоча відчуває себе математикою).
День

2
Я обговорюю значення "піднятого" в контексті C # тут: blogs.msdn.com/b/ericlippert/archive/2007/06/27/… - ймовірно, розробники Scala використовують цей термін аналогічно, але більше загальна мода.
Ерік Ліпперт

Відповіді:


22

Я не знайомий з API API.

Термін "підняття" походить від теорії категорій. У мовах програмування, таких як Haskell або Scala, liftфункція приймає функцію A => Bі якось виконує магію, щоб підняту функцію F[A] => F[B]можна застосувати до функтора або монади F[A].

Конкретний приклад використання Seqконтейнера Scala : Припустимо, у нас є функція def double(x: Int): Int = 2 * xта послідовність val xs = Seq(1, 2, 3). Ми не можемо double(xs)через несумісні типи. Але якщо ми отримаємо a val doubleSeq = liftToSeq(double), ми можемо зробити це doubleSeq(xs), що оцінює Seq(2, 4, 6). Тут liftToSeqможна реалізувати як

def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
  (seq: Seq[A]) => seq.map(f)

Seq(…)Конструктор також можна розглядати як операції підйому, який піднімає значення 1, 2, 3в Seqразі, що дозволяє нам використовувати список абстракцій для цих значень.

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


4
Це хороший опис математичного "підняття". Ми також повинні включити посилання на більш формальний опис відмови від Вікіпедії .
Скотт Вітлок

3
Можливо, більш зрозумілий приклад "підйому" - це підняття на нульові (або "необов'язкові" чи "можливо") типи. Наприклад, припустимо, у вас +визначений такий оператор , що int + int --> int. Оператор піднятого до int? + int? --> int?нульового значення має семантику "якщо будь-який операнд є нульовим, то відповідь є нульовим, інакше використовувати непіднятий оператор на значеннях".
Ерік Ліпперт

@ScottWhitlock Ви навіть піднімаєтесь?
Гельріх

1
@Frank Я прочитав статтю у Вікіпедії, перш ніж написати свою відповідь, і не зрозумів її. Натомість я вважав, що Haskell Wiki on Lifting є більш доступним. Зауважте, що насправді не існує чотирьох типів. У нас є чотири конкретні типи, але лише три змінних типу: два типи Aі B, і функтор, Fякий є конструктором типу.
амон

1
Я не надто глибоко вникаю у все це, але якщо Fце конструктор типів, то F[A]це один із його побудованих типів. То чому ж неправильно говорити про ці чотири типи? (два типи і один тип конструктора були б однаково чудовими, хоча, звичайно)
Френк

6

Термін скасувати, звичайно, може мати різний зміст залежно від контексту.

У загальному програмуванні він описує процес абстрагування до наступного вищого рівня. Наприклад, у вас може бути два фрагменти коду, один тип - з int, а другий - float. Скасування цього коду означатиме щось на кшталт шаблонування методу із загальним типом, Tякий працює і для, intі для float.

Я вважав, що використання цього терміна є хорошим інтуїтивним орієнтиром щодо того, що означає підйом . Єдиною різницею, яка, здається, існує між різними контекстами, є те, чим насправді є ця вища абстракція.

Зокрема, Віктора відомий в контексті функціонального програмування, і в цьому контексті можна зустріти напрочуд різні інтерпретації підйому . Одним із прикладів є підняття значень у функтор або підняття функцій для роботи над монадичними значеннями (тобто Haskell's liftM2).

Дуже конкретний приклад "піднятого представництва" може тоді f.ex. бути a List(1), або a Some(1).


4

Такі види понять, як правило, найлегше зрозуміти на конкретному прикладі. Розглянемо наступний уривок із цього прикладу API потоку :

Flow(text.split("\\s").toVector).
      // transform
      map(line => line.toUpperCase).
      // print to console (can also use ``foreach(println)``)
      foreach(transformedLine => println(transformedLine)).
      onComplete(FlowMaterializer(MaterializerSettings())) {
        case Success(_) => system.shutdown()
        case Failure(e) =>
          println("Failure: " + e.getMessage)
          system.shutdown()
      }

Для цього використовується наступний код:

text.split("\\s").toVector.
      map(line => line.toUpperCase).
      foreach(println)

і "піднімає" його в Flowконтекст. Це дозволяє використовувати той самий синтаксис, який ви знайомий для вказівки вашого алгоритму, але за лаштунками mapце робиться паралельно на декількох процесорах чи навіть машинах, то foreach(println)безперешкодно збирає цей вихід назад на один процесор для друку.

Це загальний термін, який може стосуватися обгортання будь-якого контексту навколо будь-якого типу. Ще один звичний приклад - mapце функція, яка працює над одним елементом і "піднімає" її в новий контекст роботи над колекцією цих елементів. Піднімання є повсюдним у функціональному програмуванні, і одна з головних причин - набагато простіше повторно використовувати функціональний код.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.