Właśnie natknąłem się na ten termin tutaj:
http://www.codemesh.io/codemesh2014/viktor-klang
„Zaprezentujemy Flow API - zniesioną reprezentację - a także możliwy do podłączenia sposób przekształcenia zniesionej reprezentacji w reprezentację wykonawczą - Flow Materialization”.
Googling niewiele pomógł.
scala
actor-model
akka
dataflow
Legowisko
źródło
źródło
Odpowiedzi:
Nie znam interfejsu API Flow.
Termin „podnoszenie” pochodzi od teorii kategorii. W językach programowania, takich jak Haskell lub Scala,
lift
funkcja przyjmuje funkcjęA => B
i w jakiś sposób wykonuje magię, dzięki czemu podniesioną funkcjęF[A] => F[B]
można zastosować do funktora lub monadyF[A]
.Konkretny przykład z wykorzystaniem
Seq
kontenera Scali : Załóżmy, że mamy funkcjędef double(x: Int): Int = 2 * x
i sekwencjęval xs = Seq(1, 2, 3)
. Nie możemy zdouble(xs)
powodu niezgodnych typów. Ale jeśli otrzymamyval doubleSeq = liftToSeq(double)
, możemy to zrobićdoubleSeq(xs)
, co oceniaSeq(2, 4, 6)
. TutajliftToSeq
można zaimplementować jakoSeq(…)
Konstruktor może być również postrzegane jako operacja podnoszenia, który podnosi wartość1, 2, 3
naSeq
przykład, co pozwala nam korzystać z list abstrakcje dla tych wartości.Monady pozwalają nam enkapsulować wewnętrzne działania pewnego rodzaju, oferując wodoszczelny, ale łatwy do skomponowania interfejs. Zastosowanie podniesionej reprezentacji może ułatwić uzasadnienie obliczeń. Korzystanie z takich abstrakcji oznacza również, że tracimy wiedzę na temat abstrakcji, ale są one potrzebne do zapewnienia efektywnej implementacji pod maską (znalezienie odpowiedniej reprezentacji wykonania).
źródło
+
zdefiniowanego w taki sposóbint + int --> int
. Operator podniesiony doint? + int? --> int?
pustego ma semantykę „jeśli którykolwiek operand ma wartość zerową, wówczas odpowiedź jest pusta, w przeciwnym razie użyj operatora nie podniesionego do wartości”.A
iB
oraz funktor,F
który jest konstruktorem typów.F
jest konstruktorem typów, toF[A]
jest jednym z jego typów. Dlaczego więc źle jest mówić o tych czterech typach? (dwa typy i jeden typ konstruktora byłyby oczywiście równie dobre)Termin „ podnoszenie” może oczywiście mieć różne znaczenie w zależności od kontekstu.
W programowaniu ogólnym opisuje proces abstrakcji do następnego wyższego poziomu. Na przykład, możesz mieć dwa fragmenty kodu, jeden typ z
int
, a drugi zfloat
. Zniesienie tego kodu oznaczałoby coś w rodzaju szablonowania metody za pomocą ogólnego typu,T
który działa zarówno dla, jakint
ifloat
.Uznałem, że użycie tego terminu jest dobrą intuicyjną wytyczną dotyczącą tego, co oznacza podnoszenie . Jedyna różnica, jaka wydaje się istnieć między różnymi kontekstami, polega na tym, czym tak naprawdę jest ta wyższa abstrakcja.
W szczególności Viktor jest znany w kontekście programowania funkcjonalnego, aw tym kontekście można znaleźć wyraźnie różne interpretacje podnoszenia . Jednym z przykładów jest podniesienie wartości do funktora lub podniesienie funkcji do pracy na wartościach monadycznych (tj. Haskella
liftM2
).Bardzo konkretny przykład „zniesionej reprezentacji” mógłby np. Np. być
List(1)
alboSome(1)
.źródło
Tego rodzaju pojęcia są zazwyczaj najłatwiejsze do zrozumienia na konkretnym przykładzie. Rozważ następujący fragment tego przykładu interfejsu API Flow :
To wymaga następującego kodu:
i „podnosi” to w
Flow
kontekście. Pozwala to na użycie tej samej składni, którą znasz do określania algorytmu, ale za kulisamimap
odbywa się to równolegle na kilku procesorach, a nawet na maszynach, a następnieforeach(println)
płynnie zbiera dane wyjściowe z powrotem do jednego procesora w celu drukowania.Jest to ogólny termin, który może odnosić się do zawijania dowolnego kontekstu wokół dowolnego typu. Innym bardziej znanym przykładem jest
map
funkcja, która działa na jednym elemencie i „przenosi” go w nowy kontekst pracy nad kolekcją tych elementów. Podnoszenie jest wszechobecne w programowaniu funkcjonalnym i jednym z głównych powodów o wiele łatwiejszego ponownego wykorzystania kodu funkcjonalnego.źródło