Che cos'è una "rappresentazione sollevata"?


12

Ho appena incontrato questo termine qui:

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

"Dimostreremo l'API Flow - una rappresentazione rialzata - nonché un modo collegabile di trasformare la rappresentazione sollevata in rappresentazione dell'esecuzione: materializzazione del flusso".

Googling non ha aiutato molto.


lettura consigliata: discuti di questo $ {blog}
moscerino

11
@gnat sembra che non abbia inventato quel termine, non sembra un'opinione, non è suscettibile di provocare una discussione e il mio istinto è che non sarà troppo ampio (anche se sembra matematica).
Den

2
Discuto il significato di "sollevato" nel contesto di C # qui: blogs.msdn.com/b/ericlippert/archive/2007/06/27/… - probabilmente gli sviluppatori Scala stanno usando il termine in modo analogo, ma più moda generale.
Eric Lippert,

Risposte:


22

Non ho familiarità con l'API Flow.

Il termine "sollevamento" deriva dalla teoria delle categorie. In linguaggi di programmazione come Haskell o Scala, una liftfunzione assume una funzione A => Be in qualche modo esegue la magia in modo che la funzione sollevata F[A] => F[B]possa essere applicata a un funzione o monade F[A].

Un esempio concreto usando il Seqcontenitore di Scala : Supponiamo di avere una funzione def double(x: Int): Int = 2 * xe una sequenza val xs = Seq(1, 2, 3). Non possiamo a double(xs)causa di tipi incompatibili. Ma se otteniamo un val doubleSeq = liftToSeq(double), possiamo fare doubleSeq(xs), che valuta Seq(2, 4, 6). Qui, liftToSeqpuò essere implementato come

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

Il Seq(…)costruttore può anche essere visto come un'operazione di sollevamento, che solleva i valori 1, 2, 3in Sequn'istanza, permettendoci così di utilizzare le astrazioni dell'elenco per questi valori.

Le monadi ci consentono di incapsulare i meccanismi interni di qualche tipo offrendo un'interfaccia a tenuta stagna ma compostabile. L'uso di una rappresentazione elevata può rendere più semplice ragionare su un calcolo. L'uso di tali astrazioni significa anche che perdiamo la conoscenza dei dettagli sottratti, ma quelli sono necessari per fornire un'implementazione efficiente sotto il cofano (trovare una rappresentazione di esecuzione adatta).


4
Questa è una buona descrizione del "sollevamento" matematico. Dovremmo anche includere un riferimento alla descrizione più formale del sollevamento da Wikipedia .
Scott Whitlock,

3
Un esempio forse più chiaro di "sollevamento" è il sollevamento a tipi nullable (o "facoltativi" o "forse"). Ad esempio, supponiamo di avere un operatore +definito in modo tale int + int --> int. L'operatore elevato a int? + int? --> int?nulla ha la semantica di "se uno degli operandi è nullo allora la risposta è nulla, altrimenti usa l'operatore non elevato sui valori".
Eric Lippert,

@ScottWhitlock Sollevi anche?
Helrich,

1
@Frank Ho letto l'articolo di Wikipedia prima di scrivere la mia risposta e non l'ho capito neanche io. Invece, ho trovato il Wiki di Haskell su Lifting più accessibile. Si noti che non abbiamo davvero quattro tipi. Abbiamo quattro tipi concreti, ma solo tre variabili di tipo: due tipi Ae B, e un functor Fche è un costruttore di tipi.
Amon,

1
Non sono troppo approfondito in tutto questo, ma se Fè un costruttore di tipi, allora F[A]è uno dei suoi tipi costruiti. Quindi perché è sbagliato parlare di questi quattro tipi? (due tipi e un tipo di costruttore andrebbero ugualmente bene, ovviamente)
Frank,

6

Il termine da sollevare può ovviamente avere significati diversi a seconda del contesto.

Nella programmazione generica descrive il processo di astrazione al livello superiore successivo. Ad esempio, potresti avere due parti di codice, un tipo con inte l'altro con float. Sollevare questo codice significherebbe qualcosa di simile al modello del metodo con un tipo generico Tche funziona per entrambi inte float.

Ho trovato questo uso del termine come una buona linea guida intuitiva sul significato del sollevamento . L'unica differenza che sembra esistere tra i diversi contesti è ciò che è realmente questa astrazione superiore.

In particolare, Viktor è noto nel contesto della programmazione funzionale e, in questo contesto, è possibile trovare interpretazioni visivamente diverse del sollevamento lì. Un esempio, è quello di elevare i valori in un funzione, o di elevare le funzioni per lavorare su valori monadici (cioè di Haskell liftM2).

Un esempio molto concreto di "rappresentazione sollevata" potrebbe quindi f.ex. essere a List(1), o a Some(1).


4

Questi tipi di concetti sono generalmente più facili da comprendere con un esempio concreto. Considerare il seguente estratto da questo esempio dell'API Flow :

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()
      }

Questo richiede il seguente codice:

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

e lo "solleva" in un Flowcontesto. Ciò ti consente di utilizzare la stessa sintassi con cui hai familiarità per specificare l'algoritmo, ma dietro le quinte mapviene fatto in parallelo su più processori o persino macchine, quindi foreach(println)raccoglie senza problemi l'output su un processore per la stampa.

Questo è un termine generico che può riferirsi a avvolgere qualsiasi contesto attorno a qualsiasi tipo. Un altro esempio più familiare è la mapfunzione che lavora su un singolo elemento e lo "solleva" nel nuovo contesto di lavoro su una raccolta di quegli elementi. Il sollevamento è onnipresente nella programmazione funzionale e uno dei motivi principali per cui è molto più semplice riutilizzare il codice funzionale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.