“Kaldırılmış temsil” nedir?


12

Bu terime burada rastladım:

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

"Akış API'sini (yükseltilmiş gösterim) ve yükseltilmiş gösterimi yürütme gösterimine dönüştürmenin takılabilir bir yolunu (Akış Gerçekleştirme) göstereceğiz."

Google'da fazla yardımcı olmadı.


önerilen okuma: Bu $ {blog} tartışın
gnat

11
@gnat, bu terimi icat etmediği, bir fikir gibi görünmediği, bir tartışmayı kışkırtması olası değildir ve bağırsak hissim, çok geniş olmayacağıdır (matematik gibi hissetmesine rağmen).
Den

2
"Kaldırılmış" ın anlamını burada C # bağlamında tartışıyorum : blogs.msdn.com/b/ericlippert/archive/2007/06/27/… - muhtemelen Scala geliştiricileri bu terimi benzer bir şekilde kullanıyor, ancak daha fazlası genel moda.
Eric Lippert

Yanıtlar:


22

Flow API'sine aşina değilim.

“Kaldırma” terimi kategori teorisinden gelir. Haskell veya Scala gibi programlama dillerinde, bir liftişlev bir işlevi alır A => Bve kaldırılan işlevin F[A] => F[B]bir functor'a veya monad'a uygulanabilmesi için bir şekilde sihir yapar F[A].

Scala'nın Seqkabını kullanan somut bir örnek : Bir fonksiyonumuz def double(x: Int): Int = 2 * xve bir dizimiz olduğunu varsayın val xs = Seq(1, 2, 3). double(xs)Uyumsuz tipler nedeniyle yapamayız . Ama bir elde val doubleSeq = liftToSeq(double)edersek, yapabiliriz doubleSeq(xs), ki bunu değerlendirir Seq(2, 4, 6). Burada, liftToSeqolarak uygulanabilir

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

Seq(…)Yapıcı da değerlerini kaldırır bir kaldırma operasyonu, olarak görülebilir 1, 2, 3bir içine Seqböylece bize bu değerler için liste soyut kullanmak için izin Örneğin.

Monadlar, su geçirmez, ancak birleştirilebilir bir arayüz sunarak bir tür iç işi kapsüle etmemizi sağlar. Kaldırılmış bir gösterim kullanmak bir hesaplama hakkında akıl yürütmeyi kolaylaştırabilir. Bu tür soyutlamaların kullanılması, aynı zamanda soyutlanmış özellikler hakkında bilgimizi kaybettiğimiz anlamına gelir, ancak başlık altında etkili bir uygulama sağlamak için bunlara ihtiyaç vardır (uygun bir yürütme temsili bulmak).


4
Bu matematiksel “kaldırma” nın iyi bir tanımıdır. Ayrıca Wikipedia'dan kaldırmanın daha resmi açıklamasına bir referans da eklemeliyiz .
Scott Whitlock

3
"Kaldırma" için belki de daha açık bir örnek, boş bırakılabilir (veya "isteğe bağlı" veya "belki") türlere kaldırmadır. Örneğin, +öyle tanımlanmış bir operatörünüz olduğunu varsayalım int + int --> int. Kaldırılabilir-boş bırakılabilir işleç int? + int? --> int?, "işlenenlerden biri boşsa, o zaman cevap boşsa, aksi takdirde kaldırılmamış operatörü değerlerde kullanın" semantiğine sahiptir.
Eric Lippert

@ScottWhitlock Hatta kaldırıyor musunuz?
helrich

1
@Frank cevabımı yazmadan önce Wikipedia makalesini okudum ve anlamadım. Bunun yerine, buldum Haskell Wiki üzerinde Kaldırma daha erişilebilir olması için. Gerçekten dört tipimiz olmadığını unutmayın. Dört somut tipimiz var, ama sadece üç tip değişkeni var: iki tip ve bir tip oluşturucu olan bir functor . ABF
amon

1
Bunların hepsinde çok derin değilim, ama eğer Fbir tür kurucu ise, o zaman F[A]onun inşa türlerinden biridir. Öyleyse neden bu dört tipten bahsetmek yanlış? (iki tip ve bir tip kurucu elbette eşit derecede iyi olurdu)
Frank

6

Kaldırma terimi elbette bağlama bağlı olarak farklı anlamlara sahip olabilir.

Gelen jenerik programlama bir sonraki üst seviyeye soyutlayarak sürecini tarif eder. Örneğin, iki parça kod, bir ile türüne sahip olabilir int, ve diğer float. Bu kodu Kaldırma bir cins yöntemi templating gibi bir şey anlamına geleceğini Tikisi için çalışır, intve float.

Terimin bu kullanımının, kaldırma anlamına geldiği için iyi bir sezgisel rehber olduğunu buldum . Farklı bağlamlar arasında var gibi görünen tek fark, bu yüksek soyutlamanın gerçekte ne olduğudur.

Özellikle, Viktor fonksiyonel programlama bağlamında bilinir ve bu bağlamda, orada kaldırmanın gözle görülür farklı yorumlarını bulabilirsiniz . Bir örnek, değerleri bir işleve yükseltmek veya monadik değerler (örn. Haskell liftM2) üzerinde çalışmak üzere işlevleri kaldırmaktır .

"Kaldırılmış temsilin" çok somut bir örneği f.ex. a List(1)veya a Some(1).


4

Bu tür kavramlar genellikle somut bir örnekle anlaşılması en kolay yöntemdir. Bu Flow API örneğinden aşağıdaki alıntıyı düşünün :

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

Bu, aşağıdaki kodu alır:

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

ve bunu bir Flowbağlam içine "kaldırır" . Bu, algoritmanızı belirtmek için tanıdığınız sözdizimini kullanmanıza izin verir, ancak sahnelerin arkasında, mapbirkaç işlemci veya hatta makinede paralel olarak yapılır, daha sonra foreach(println)bu çıktıyı baskı için tek bir işlemciye sorunsuz bir şekilde toplar.

Bu, herhangi bir bağlamın herhangi bir türün etrafına sarılması anlamına gelebilen genel bir terimdir. Başka bir tanıdık örnek, maptek bir öğe üzerinde çalışan bir işlevi alır ve onu bu öğelerin bir koleksiyonu üzerinde çalışmanın yeni bağlamına "kaldırır". Kaldırma, fonksiyonel programlamada her yerde bulunur ve temel nedenlerden biri, fonksiyonel kodu yeniden kullanmak çok daha kolaydır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.