“Oluşturma” nın anlamı nedir?


35

Pek çok metin görüyorum, özellikle de işlevsel programlama metinleri, belirli CS kavramlarının "oluşturulmadığını" iddia ediyor . Örnekler: kilitler oluşturulmaz, monadlar oluşturulmaz.

Bu ifadenin anlamını tam olarak takip etmekte zorlanıyorum. Kompozisyonu düşündüğüm zaman, ya fonksiyon kompozisyonunu ya da nesne toplanmasını düşünüyorum (“kalıtım yerine kompozisyon lehine” olduğu gibi), ama bu insanların onu burada kullandığı duygusu gibi görünmüyor.

Birisi, bu iki cümlenin, yukarıdaki iki örnek (örneğin, kilitler ve monadlar) gibi ifadelerde kullanıldığında ne anlama geldiğini açıklayabilir mi?


İşlev bileşimi anlamında nesne toplanmasından daha yakındır.
Andres F.

Kabaca ve gayrı resmi olarak, kilitleri kullanan iki ayrı şeyiniz varsa, bunları birbirine yapıştırmak zordur. (kilitleri durumunda, kilitlenmeleri tanıtan olmadan yapmak zordur; monads durumunda, türleri karmaşık bir hale gelebilir)
user253751

Yanıtlar:


35

İnsanlar derken onlar "oluşturmadeneyimine" tarafından gerçekten sadece aracı "araya" ve ne anlama geldiğini, "X oluşturma değil" ne ve nasıl tam olarak "X" ne bağlı olarak çok farklı olabilir onları biraraya koydu.

Ayrıca, "oluşturma" derken, biraz farklı şeyler ifade edebilirler:

  1. İki X'i bir araya getiremezsin, dönem.
  2. Sen edebilirsiniz birlikte iki Xs koymak, ancak sonuç bir X olmayabilir (IOW: X edilmez kompozisyon altında kapalı .)
  3. İki X'i bir araya getirebilirsiniz, ancak ortaya çıkan X beklediğiniz şekilde çalışmayabilir.

# 1 için bir örnek, tarayıcı / lexer içeren ayrıştırıcılardır. "Tarayıcılar / lexers oluşturulmaz" ifadesini duyabilirsiniz. Bu aslında doğru değil. Demek istedikleri "ayrı bir lexing aşaması kullanan ayrıştırıcı oluşturma" dır.

Neden ortak ayrıştırıcılar oluşturmak istersiniz? Peki, JetBrains, Eclipse Foundation, Microsoft veya Embarcadero gibi bir IDE satıcısı olduğunuzu ve bir web çerçevesi için bir IDE oluşturmak istediğinizi hayal edin. Tipik web geliştirmede, genellikle dilleri karıştırıyoruz. <script>ECMAScript içeren öğeler içeren HTML dosyalarınız ve<style>CSS içeren elemanlar. HTML, bazı programlama dili ve bazı şablon dili metasyntax içeren şablon dosyalarınız var. "Python", "Bir şablona gömülü Python", "CSS", "HTML içinde CSS", "ECMASCript", "HTML içinde ECMAScript", "HTML", "HTML içinde farklı sözdizimi vurgulayıcıları yazmak istemezsiniz Bir şablon "ve diğerleri ve diğerleri. Python için, biri HTML için, biri şablon dili için bir sözdizimi vurgulayıcısı yazmak ve üçünü de bir şablon dosyası için bir sözdizimi vurgulayıcısı olarak oluşturmak istiyorsunuz.

Bununla birlikte, bir lexer tüm dosyayı yalnızca bir dil için anlam ifade eden bir belirteç akışına ayrıştırır. Diğer dilin ayrıştırıcısı, Lexer'in geçtiği belirteçlerle çalışamaz. Örneğin, Python ayrıştırıcıları tipik olarak, lexer'ın girintiyi takip edeceği INDENTve DEDENTbelirteç akışının içine sahte ve jetonlar enjekte edecek şekilde yazılır , böylece Python'un sözdizimi gerçekte olmasa bile ayrıştırıcının bağlamsız kalmasına izin verir. Bununla birlikte, bir HTML lexer, HTML'de bir anlamı olmadığı için boşlukları tamamen görmezden gelecektir.

Bununla birlikte, basitçe karakter okuyan, tarayıcısız bir çözümleyici, karakter akışını farklı bir çözümleyiciye aktarabilir;

# 2 için bir örnek, içinde SQL sorguları bulunan dizelerdir. Her biri sözdizimsel olarak doğru bir SQL sorgusu olan iki dizginiz olabilir, ancak iki dizgiyi birleştirirseniz, sonuç sözdizimsel olarak doğru bir SQL sorgusu olmayabilir. Biz gibi sorgu cebirlerini İşte bu yüzden en ARel, do oluşturma.

Kilitler # 3 örneğidir. Kilitleri olan iki programınız varsa ve bunları tek bir programda birleştirirseniz, hala kilitleri olan bir programınız vardır, ancak iki orijinal program tamamen doğru olsa bile, kilitlenme ve yarışsız özelliği. Kilitlerin doğru kullanımı, tüm programın genel bir özelliğidir ve programları oluştururken korunmayan bir özelliktir. Bu örnek, işlemler için farklıdır yapmak oluşturma deneyimini. İşlemleri doğru kullanan bir program, böyle bir programla oluşturulabilir ve işlemleri doğru bir şekilde kullanan birleşik bir program sunar.


1
Başka bir deyişle, “oluşturulmaz”, “bir yarı grup oluşturmaz” (veya biraz daha güçlü bir şekilde bir monoid) anlamına gelir.
Jon Purdy

Birlikçi olmak gerektiğinden emin değilim, bu yüzden daha çok (bir süre önce 3 saniye önce öğrendiğim bir Magma gibi)
Jörg W Mittag

Ancak, birisine "kilitler oluşturma" derken ne anlama geldiklerini sorarsanız, kesinlikle cevap vermeyeceklerinden eminim "Yani, kilitli doğru eşzamanlı programlar kümesi ve kompozisyon işlemi bir Magma oluşturur" .
Jörg W Mittag

Hah, elbette değil. Sadece alternatif bir cümle. Birliğin “düz” bir kompozisyon hissini sürdürmek için gerekli olduğunu, ancak bunu destekleyecek güçlü bir argüman olmadığının farkındayım.
Jon Purdy

20

Composability, daha büyük bileşenler ve daha karmaşık işlevler üretmek için program bileşenlerini birlikte ve kolayca birleştirebileceğiniz anlamına gelir.

Bileşenleri daha iyi bir hale getirmeye yardımcı olan bazı şeyler:

  1. Idempotence. Bir idempotent işlevi, aynı parametre değerleriyle birden çok kez çağrılırsa, her zaman aynı çıktıyı veya yan etkileri üretir. Bu, bir işlev çağrısının sonucunun tahmin edilebilir olması nedeniyle birleştirilebilirliği artırır.

  2. Referans Şeffaflık. Referans olarak saydam bir ifade her zaman aynı sonucu değerlendirir. Bu, aynı ifadelerin birbirleri için ikame edilmesine izin vererek ve ifadelerin kilit kullanmadan birbirlerinden bağımsız olarak (yani farklı iplikler üzerinde) hesaplanmasına izin vererek bileşimin kabiliyetini arttırır .

  3. Değiştirilemezlik. Değişmez bir nesnenin durumu oluşturulduktan sonra değiştirilemez. Bu, birleştirilebilirliği artırır, çünkü nesnenin sabit bir değerine güvenebilirsiniz, eğer bir işlev veya nesne bir yerde yaratıldıktan sonra nesnenin durumunu değiştirmişse endişelenmeden.

  4. Saflık. Saf fonksiyonların yan etkileri yoktur. Sadece bir girişe ve bir çıkışa sahiptirler, bu onları daha fazla zorlanabilir kılar çünkü bir işlevin çıktısını, işlevin dışında bir şeyin değişip değişmediği konusunda endişelenmeden başka bir işlevin girişine koyabilirsiniz.

Kilitler oluşmaz, çünkü bunlar bazı halleri paylaşan iki işlemi bir araya getirirken güvenmeniz gereken bir dış unsurdurlar ve kilitlerin kullanımındaki karmaşıklıkla ilgili her türlü nedenden ötürü.

"Monad'lar oluşturmadı" tabiri bana pek mantıklı gelmiyor. Bir monadın tüm amacı, klavye girişi veya ekran çıkışı gibi durumsal olan bir şeyi almak ve aslında daha zor olan daha saf, matematiksel bir forma dönüştürmektir.


4
Bence stackoverflow.com/questions/7040844/… "monad'ların beste etmediğini" açıklayan iyi bir iş yapıyor, muhtemelen monadların kilitlerden çok daha fazla beste edilebilir olduğunu kabul ediyorum.
Ixrec,

"Referans şeffaflık" ve "saflık" için madde işaretleri, aslında saflık için iki gerekliliktir . "Referans şeffaflık" teriminden kaçınılmalıdır çünkü iyi tanımlanmamıştır .
BlueRaja - Danny Pflughoeft

1
Bir monad, belirli işlemlerle birlikte cebirsel bir yapıdır. Son paragrafınızda tanımladığınız şey, IOklavye girişi gibi "durum bilgisi olan eylemleri" yakalayan türdür. Türün değerleri IO, aslında, oluşturur, ancak bir monad olan bütün türü IO . Bu tür, liste türü gibi monad'lar olan diğer türlerle oluşturulmaz. Olduğunu, biz sistematik bir tür üretemez IO . Listgibi davranacağını hem IO ve Listaynı anda. bu mantıklı mı? Açıkladığımdan emin değilim.
Tikhon Jelvis
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.