Apa itu "perwakilan terangkat"?

12

Berlari melintasi istilah ini di sini:

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

"Kami akan mendemonstrasikan Flow API — representasi terangkat — serta cara pluggable untuk mengubah representasi terangkat ke representasi eksekusi — Materialisasi Aliran."

Googling tidak banyak membantu.

Sarang
sumber
direkomendasikan membaca: Diskusikan $ {blog} ini
nyamuk
11
@gnat sepertinya dia tidak menciptakan istilah itu, itu tidak terlihat seperti pendapat, itu tidak akan memancing diskusi dan firasat saya adalah bahwa itu tidak akan terlalu luas (walaupun terasa seperti matematika).
Den
2
Saya membahas arti "terangkat" dalam konteks C # di sini: blogs.msdn.com/b/ericlippert/archive/2007/06/27/… - sepertinya pengembang Scala menggunakan istilah tersebut secara analog, tetapi lebih mode umum.
Eric Lippert

Jawaban:

22

Saya tidak terbiasa dengan Flow API.

Istilah "mengangkat" berasal dari teori kategori. Dalam bahasa pemrograman seperti Haskell atau Scala, suatu liftfungsi mengambil fungsi A => B, dan entah bagaimana melakukan sihir sehingga fungsi yang diangkat F[A] => F[B]dapat diterapkan ke functor atau monad F[A].

Contoh konkret menggunakan Seqwadah Scala : Asumsikan kita memiliki fungsi def double(x: Int): Int = 2 * x, dan urutan val xs = Seq(1, 2, 3). Kami tidak dapat double(xs)karena jenis yang tidak kompatibel. Tetapi jika kita memperoleh val doubleSeq = liftToSeq(double), kita bisa melakukan doubleSeq(xs), yang dievaluasi Seq(2, 4, 6). Di sini, liftToSeqbisa diimplementasikan sebagai

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

The Seq(…)konstruktor juga dapat dilihat sebagai operasi pengangkatan, yang mengangkat nilai-nilai 1, 2, 3menjadi Seqcontoh, sehingga memungkinkan kita untuk menggunakan daftar abstraksi untuk nilai-nilai ini.

Monads memungkinkan kita untuk merangkum bagian dalam dari beberapa tipe dengan menawarkan antarmuka yang kedap air tetapi dapat digabungkan. Menggunakan representasi terangkat dapat membuatnya lebih mudah untuk alasan tentang perhitungan. Menggunakan abstraksi semacam itu juga berarti bahwa kita kehilangan pengetahuan tentang spesifik yang diabstraksi, tetapi diperlukan untuk menyediakan implementasi yang efisien di bawah tenda (menemukan representasi eksekusi yang sesuai).

amon
sumber
4
Itu deskripsi yang baik tentang matematika "mengangkat". Kami juga harus memasukkan referensi ke deskripsi yang lebih formal tentang pengangkatan dari Wikipedia .
Scott Whitlock
3
Contoh yang mungkin lebih jelas dari "mengangkat" adalah mengangkat ke jenis nullable (atau "opsional" atau "mungkin"). Misalnya, anggap Anda memiliki operator yang +ditentukan sedemikian rupa int + int --> int. Operator lifted-to-nullable int? + int? --> int?memiliki semantik "jika salah satu operan adalah null maka jawabannya adalah null, jika tidak gunakan operator yang tidak diangkat pada nilai-nilai".
Eric Lippert
@ScottWhitlock Apakah Anda bahkan mengangkat?
helrich
1
@ Sejujurnya saya membaca artikel Wikipedia sebelum menulis jawaban saya, dan juga tidak memahaminya. Sebaliknya, saya menemukan yang Haskell Wiki di Lifting menjadi lebih mudah diakses. Perhatikan bahwa kita tidak benar-benar memiliki empat tipe. Kami memiliki empat tipe konkret, tetapi hanya tiga tipe variabel: dua tipe Adan B, dan functor Fyang merupakan konstruktor tipe.
amon
1
Saya tidak terlalu jauh ke dalam semua ini, tetapi jika Fmerupakan konstruktor tipe, maka F[A]adalah salah satu tipe konstruksinya. Jadi mengapa salah berbicara tentang keempat tipe ini? (dua tipe dan satu tipe konstruktor akan sama-sama baik-baik saja meskipun tentu saja)
Frank
6

Istilah untuk mengangkat tentu saja dapat memiliki arti yang berbeda tergantung pada konteksnya.

Dalam pemrograman generik ini menggambarkan proses abstrak ke tingkat yang lebih tinggi berikutnya. Misalnya, Anda dapat memiliki dua potong kode, satu jenis dengan int, dan yang lainnya dengan float. Mengangkat kode ini akan berarti sesuatu seperti templating metode dengan tipe generik Tyang berfungsi untuk keduanya, intdan float.

Saya menemukan penggunaan istilah ini sebagai pedoman intuitif yang baik untuk apa arti mengangkat . Satu-satunya perbedaan yang tampaknya ada antara konteks yang berbeda adalah apa sebenarnya abstraksi yang lebih tinggi ini.

Secara khusus, Viktor dikenal dalam konteks pemrograman fungsional, dan dalam konteks ini, Anda dapat menemukan interpretasi yang berbeda dari mengangkat di sana. Salah satu contoh, adalah untuk mengangkat nilai menjadi functor, atau mengangkat fungsi untuk bekerja pada nilai monadik (yaitu Haskell's liftM2).

Contoh yang sangat konkret dari "representasi terangkat" kemudian bisa f.ex. menjadi List(1), atau a Some(1).

jujur
sumber
4

Konsep semacam ini biasanya paling mudah dipahami dengan contoh nyata. Pertimbangkan kutipan berikut dari contoh API Aliran ini :

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

Ini mengambil kode berikut:

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

dan "mengangkatnya" ke dalam Flowkonteks. Itu memungkinkan Anda untuk menggunakan sintaksis yang sama dengan yang Anda kenal untuk menentukan algoritme Anda, tetapi di balik layar mapitu dilakukan secara paralel pada beberapa prosesor atau bahkan mesin, kemudian secara foreach(println)mulus mengumpulkan output yang kembali ke satu prosesor untuk dicetak.

Ini adalah istilah umum yang dapat merujuk pada membungkus konteks apa pun di sekitar jenis apa pun. Contoh lain yang lebih akrab adalah mapmengambil fungsi yang bekerja pada elemen tunggal dan "mengangkatnya" ke dalam konteks baru bekerja pada kumpulan elemen-elemen tersebut. Lifting ada di mana-mana dalam pemrograman fungsional dan salah satu alasan utama adalah lebih mudah untuk menggunakan kembali kode fungsional.

Karl Bielefeldt
sumber