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.
scala
actor-model
akka
dataflow
Sarang
sumber
sumber
Jawaban:
Saya tidak terbiasa dengan Flow API.
Istilah "mengangkat" berasal dari teori kategori. Dalam bahasa pemrograman seperti Haskell atau Scala, suatu
lift
fungsi mengambil fungsiA => B
, dan entah bagaimana melakukan sihir sehingga fungsi yang diangkatF[A] => F[B]
dapat diterapkan ke functor atau monadF[A]
.Contoh konkret menggunakan
Seq
wadah Scala : Asumsikan kita memiliki fungsidef double(x: Int): Int = 2 * x
, dan urutanval xs = Seq(1, 2, 3)
. Kami tidak dapatdouble(xs)
karena jenis yang tidak kompatibel. Tetapi jika kita memperolehval doubleSeq = liftToSeq(double)
, kita bisa melakukandoubleSeq(xs)
, yang dievaluasiSeq(2, 4, 6)
. Di sini,liftToSeq
bisa diimplementasikan sebagaiThe
Seq(…)
konstruktor juga dapat dilihat sebagai operasi pengangkatan, yang mengangkat nilai-nilai1, 2, 3
menjadiSeq
contoh, 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).
sumber
+
ditentukan sedemikian rupaint + int --> int
. Operator lifted-to-nullableint? + int? --> int?
memiliki semantik "jika salah satu operan adalah null maka jawabannya adalah null, jika tidak gunakan operator yang tidak diangkat pada nilai-nilai".A
danB
, dan functorF
yang merupakan konstruktor tipe.F
merupakan konstruktor tipe, makaF[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)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 denganfloat
. Mengangkat kode ini akan berarti sesuatu seperti templating metode dengan tipe generikT
yang berfungsi untuk keduanya,int
danfloat
.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 aSome(1)
.sumber
Konsep semacam ini biasanya paling mudah dipahami dengan contoh nyata. Pertimbangkan kutipan berikut dari contoh API Aliran ini :
Ini mengambil kode berikut:
dan "mengangkatnya" ke dalam
Flow
konteks. Itu memungkinkan Anda untuk menggunakan sintaksis yang sama dengan yang Anda kenal untuk menentukan algoritme Anda, tetapi di balik layarmap
itu dilakukan secara paralel pada beberapa prosesor atau bahkan mesin, kemudian secaraforeach(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
map
mengambil 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.sumber