Просто наткнулся на этот термин здесь:
http://www.codemesh.io/codemesh2014/viktor-klang
«Мы продемонстрируем Flow API - поднятое представление - а также подключаемый способ преобразования поднятого представления в представление выполнения - Flow Materialization».
Поиск в Google не сильно помог.
scala
actor-model
akka
dataflow
логово
источник
источник
Ответы:
Я не знаком с API Flow.
Термин «подъем» происходит от теории категорий. В таких языках программирования, как 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)
из-за несовместимых типов. Но если мы получимval doubleSeq = liftToSeq(double)
, мы можем сделатьdoubleSeq(xs)
, что оценивается вSeq(2, 4, 6)
. ЗдесьliftToSeq
можно реализовать какSeq(…)
Конструктор также можно рассматривать как операции подъема, который поднимает значения1, 2, 3
вSeq
случае, что позволяет нам использовать список абстракций для этих значений.Монады позволяют нам инкапсулировать внутреннюю работу некоторого типа, предлагая водонепроницаемый, но составной интерфейс. Использование поднятого представления может облегчить рассуждение о вычислении. Использование таких абстракций также означает, что мы теряем знание об абстрагированных особенностях, но они необходимы для обеспечения эффективной реализации под капотом (поиск подходящего представления исполнения).
источник
+
определенный так, чтоint + int --> int
. Оператор с поднятым-обнуляемым значениемint? + int? --> int?
имеет семантику «если любой операнд равен нулю, тогда ответ равен нулю, в противном случае используйте оператор без поднятых значений».A
иB
, и функтор,F
который является конструктором типов.F
это конструктор типа, тоF[A]
это один из его созданных типов. Так почему неправильно говорить об этих четырех типах? (два типа и один конструктор типов будут одинаково хороши, конечно)Термин « поднять» может, конечно, иметь разные значения в зависимости от контекста.
В общем программировании он описывает процесс абстрагирования на следующий более высокий уровень. Например, у вас может быть два фрагмента кода, один с типом
int
, а другой сfloat
. Отмена этого кода будет означать что-то вроде шаблонизации метода с универсальным типом,T
который работает как для, такint
и дляfloat
.Я нашел это использование термина, чтобы быть хорошим интуитивным руководством для того, что означает подъем . Единственное различие, которое, кажется, существует между различными контекстами, состоит в том, чем на самом деле является эта более высокая абстракция.
В частности, Виктор известен в контексте функционального программирования, и в этом контексте вы можете найти совершенно разные интерпретации подъема . Один из примеров - поднять значения в функтор или поднять функции для работы с монадическими значениями (например, Haskell
liftM2
).Очень конкретный пример «поднятого представления» может быть, например, быть
List(1)
, илиSome(1)
.источник
Подобные концепции обычно легче всего понять на конкретном примере. Рассмотрим следующую выдержку из этого примера API потока :
Это займет следующий код:
и «поднимает» это в
Flow
контекст. Это позволяет вам использовать тот же синтаксис, с которым вы знакомы, для определения вашего алгоритма, но за кулисамиmap
выполняется параллельно на нескольких процессорах или даже машинах, а затемforeach(println)
беспрепятственно собирает выходные данные обратно на один процессор для печати.Это общий термин, который может относиться к обтеканию любого контекста вокруг любого типа. Еще один более знакомый пример -
map
использование функции, работающей с одним элементом, и «поднятие» ее в новый контекст работы с коллекцией этих элементов. Лифтинг повсеместен в функциональном программировании и является одной из основных причин, по которой намного проще повторно использовать функциональный код.источник