Bin gerade auf diesen Begriff hier gestoßen:
http://www.codemesh.io/codemesh2014/viktor-klang
"Wir demonstrieren die Flow-API - eine erweiterte Darstellung - sowie eine steckbare Möglichkeit, die erweiterte Darstellung in die Ausführungsdarstellung - Flow Materialization - umzuwandeln."
Googeln hat nicht viel geholfen.
Antworten:
Ich bin nicht mit der Flow-API vertraut.
Der Begriff „Heben“ stammt aus der Kategorietheorie. In Programmiersprachen wie Haskell oder Scala
lift
übernimmt eine Funktion eine FunktionA => B
und führt auf irgendeine Weise Magie aus, so dass die aufgehobene FunktionF[A] => F[B]
auf einen Funktor oder eine Monade angewendet werden kannF[A]
.Ein konkretes Beispiel mit dem
Seq
Container von Scala : Angenommen, wir haben eine Funktiondef double(x: Int): Int = 2 * x
und eine Sequenzval xs = Seq(1, 2, 3)
. Wir können nichtdouble(xs)
wegen inkompatiblen Typen. Aber wenn wir einen bekommenval doubleSeq = liftToSeq(double)
, können wir das tundoubleSeq(xs)
, was sich auszahltSeq(2, 4, 6)
. HierliftToSeq
kann als implementiert werdenDer
Seq(…)
Konstruktor kann auch als Hebevorgang angesehen werden, der die Werte1, 2, 3
in eineSeq
Instanz hebt und es uns ermöglicht, Listenabstraktionen für diese Werte zu verwenden.Monaden ermöglichen es uns, das Innenleben eines bestimmten Typs zu kapseln, indem sie eine wasserdichte, aber zusammensetzbare Oberfläche bieten. Die Verwendung einer gehobenen Darstellung erleichtert das Nachdenken über eine Berechnung. Das Verwenden solcher Abstraktionen bedeutet auch, dass wir das Wissen über die abstrahierten Besonderheiten verlieren, aber diese werden benötigt, um eine effiziente Implementierung unter der Haube zu ermöglichen (Finden einer geeigneten Ausführungsrepräsentation).
quelle
+
wie folgt definiertint + int --> int
. Der Operatorint? + int? --> int?
" Aufgehoben zu Null" hat die Semantik "Wenn einer der Operanden Null ist, ist die Antwort Null, andernfalls verwenden Sie den Operator" Nicht aufgehoben "für die Werte."A
undB
und einen Funktor,F
der ein Typkonstruktor ist.F
es sich um einen Typkonstruktor handelt, dannF[A]
ist es einer seiner konstruierten Typen. Warum ist es also falsch, von diesen vier Typen zu sprechen? (Natürlich wären zwei Typen und ein Typkonstruktor gleich gut)Der Begriff Heben kann natürlich je nach Kontext unterschiedliche Bedeutungen haben.
In der generischen Programmierung wird der Prozess der Abstraktion auf die nächsthöhere Ebene beschrieben. Beispielsweise könnten Sie zwei Codeteile haben, einen mit
int
und einen mitfloat
. Das Aufheben dieses Codes würde in etwa bedeuten, die Methode mit einem generischen Typ zu versehenT
, der für beideint
und funktioniertfloat
.Ich fand, dass diese Verwendung des Begriffs eine gute intuitive Richtlinie dafür ist, was Heben bedeutet. Der einzige Unterschied, der zwischen den verschiedenen Kontexten zu bestehen scheint, ist, was diese höhere Abstraktion wirklich ist.
Insbesondere Viktor ist im Kontext der funktionalen Programmierung bekannt, und in diesem Kontext gibt es visuell unterschiedliche Interpretationen von Heben . Ein Beispiel ist das Heben von Werten in einen Funktor oder das Heben von Funktionen zum Bearbeiten monadischer Werte (z. B. Haskells
liftM2
).Ein sehr konkretes Beispiel für eine "aufgehobene Darstellung" könnte dann z. sei a
List(1)
, oder aSome(1)
.quelle
Solche Konzepte sind in der Regel am einfachsten anhand eines konkreten Beispiels zu verstehen. Betrachten Sie den folgenden Auszug aus diesem Flow-API-Beispiel :
Dies erfordert den folgenden Code:
und "hebt" es in einen
Flow
Kontext. Auf diese Weise können Sie dieselbe Syntax verwenden, mit der Sie vertraut sind, um Ihren Algorithmus zu spezifizieren. Hinter den Kulissenmap
wird dies jedoch parallel auf mehreren Prozessoren oder sogar Maschinen durchgeführt, und dieforeach(println)
Ausgabe wird dann nahtlos zum Drucken an einen Prozessor zurückgesammelt.Dies ist ein allgemeiner Begriff, der sich auf das Umschließen eines beliebigen Kontexts mit einem beliebigen Typ beziehen kann. Ein anderes bekannteres Beispiel ist
map
die Verwendung einer Funktion, die an einem einzelnen Element arbeitet und es in den neuen Kontext der Arbeit an einer Sammlung dieser Elemente "hebt". Heben ist in der funktionalen Programmierung allgegenwärtig und einer der Hauptgründe, warum es so viel einfacher ist, funktionalen Code wiederzuverwenden.quelle