Haskell'de Scrap Boilerplate ve jenerik programlama hakkında konuşan insanlar görüyorum. bu terimler ne anlama geliyor? Ne zaman senin Boilerplate Hurda kullanmak istiyorum ve nasıl kullanabilirim? karmaşık veri türlerini dönüşümleri yaparken"Boilerplate'inizi" nedir?
cevap
Genellikle, sadece başka bir deyişle, yalnız, belirli indirgenebilir ifadeleri, redexes hedefliyorsanız --- yapının küçük parçaları etkileyecek gerekir.
klasik bir örnek tamsayı ifadeler bir tür üzerinde çift olumsuzluk ortadan kaldırılması geçerli:
data Exp = Plus Exp Exp | Mult Exp Exp | Negate Exp | Pure Int
doubleNegSimpl :: Exp -> Exp
doubleNegSimpl (Negate (Negate e)) = e
...
bile bu örneği açıklarken, ben ...
kısmının tamamını dışarı yazmak için yapmamayı tercih ediyorum. Tamamen mekaniktir --- Exp
'un tamamında yinelemeye devam etmek için motordan başka bir şey yoktur.
Bu "motor"
biz hurda niyetinde demirbaş olduğunu.Bunu başarmak için, Kişisel Demirbaş biz veri türleri üzerinde "jenerik traversals" inşa edebileceği bir mekanizma önerir Hurda. Bu geçişler, söz konusu belirli veri türü hakkında hiçbir şey bilmeden tam olarak doğru şekilde çalışır. Bunu yapmak için, çok kabaca, genel açıklamalı ağaçlar kavramımız var.
section :: Generic a => a -> AnnotatedTree
ve "geçerli" açıklamalı ağaçlar
retract :: Generic a => AnnotatedTree -> Maybe a
ADT
bazı marka haline geri yansıtılabilir: Bunların hepsi ADTS açıklamalı ağaçların türü içine yansıtılabilir şekilde ADTS daha büyüktür
Özellikle, section
ve retract
tanımlanmış olan türleri belirtmek için Generic
tip yazımını tanıtıyorum. tüm veri tiplerinin bu jenerik, açıklamalı ağaç gösterimini kullanarak
AnnotatedTree
tipine maruz kalmaması için bir arabirim (
section
ve
retract
kullanarak) sağlarız. son ve başlangıç
section
ve
retract
s ile birleştirilir ve bizim açıklamalı ağaçlar hep "geçerli" olduğunu değişmez
everywhere' :: Generic a => (a -> a) -> (AnnotatedTree -> AnnotatedTree)
böyle, yani biz
everywhere :: Generic a => (a -> a) -> (a -> a)
everywhere f a0 = fromJust . retract . everywhere' f . section
vardır: Bunun yerine, biraz benziyor
everywhere f a
ne yapar? ADT a
'da f
"her yerde" işlevini uygulamayı dener. Başka bir deyişle
doubleNegSimpl :: Exp -> Exp
doubleNegSimpl (Negate (Negate e)) = e
doubleNegSimpl e = e
şöyle Başka bir deyişle, şimdi, bizim çifte olumsuzluk basitleştirilmesi yazma REDEX (Negate (Negate _))
eşleştirememişse yazmasa bile id
gibi davranır. Bu
simplify :: Exp -> Exp
simplify = everywhere doubleNegSimpl
sonra ikili inkarın için everywhere
uygularsanız genel geçişi yoluyla "her yerde" ortadan kalkacaktır....
boilerplate gitti.
denemeye çalıştığı sorunu tanımlamayı ihmal ediyor gibi görünüyor. Her yer bir desenin başarılı bir şekilde eşleşip eşleşmediğini nasıl anlıyor? Genellikle, ayrıntılı olmayan desenler 'IO' da yakalanması gereken bir istisna atar. –
Yapmıyor. "doubleNegSimpl", redex eşleşmediğinde özdeştir, bu yüzden, "her yer", kelimenin tam anlamıyla, her yerde * uygular * ve sadece çoğu yerde bir no-op'tur. Elbette, 'her yer' bunu verimli bir şekilde yapmaya özen gösterir. –
Elbette. Açıkçası dikkatlice okumadım;) –
- 1. Bu nedir Alercontroller.recyclelistview nedir
- 2. nedir?
- 3. CLI-Loop nedir? Normal döngüdeki fark nedir?
- 4. Tomcat Bileşeni nedir? Catalina ve Coyote nedir?
- 5. Bu IIS bağlama nedir ve amaçları nedir?
- 6. [alternatives --config mta] ile görüntülenen nedir nedir?
- 7. Parametrelerde 3 nokta nedir?/Değişkenlik (...) parametresi nedir?
- 8. Sanal dizin nedir? Bunun kullanımı nedir?
- 9. sorgusunun anlamı nedir *: lucene'deki değer nedir?
- 10. Gönderen nedir?
- 11. OCaml'de "` "nedir?
- 12. System.Activator.CreateInstance nedir?
- 13. Interop.MSutil.dll nedir
- 14. ADODB.Stream nedir?
- 15. XSLT'de // nedir?
- 16. MediaRecorder.OutputFormat.DEFAULT nedir?
- 17. Javascript'te === nedir?
- 18. IHTMLScriptElement nedir?
- 19. oci_bind_by_name nedir?
- 20. Amacı nedir? * \\?
- 21. CoreDataGeneratedAccessors nedir?
- 22. kpsexpand nedir?
- 23. cmake_install.cmake nedir
- 24. Sampler2d nedir?
- 25. Haslayout nedir?
- 26. Adapter.getItem() nedir?
- 27. "= Sil" nedir?
- 28. ArrayAdapter nedir?
- 29. DWASMod.dll Nedir?
- 30. MSVCP100D.dll Nedir?
Google'ın bu konuyla ilgili bir sürü dökümanları var. –
@JustinPihony Soruyu sordum çünkü Stack Overflow'un amaçlarından biri, * tüm * programlama sorularına [Googled olanlar bile] yanıt vermektir. (http://meta.stackexchange.com/questions/5280/embrace-the-non-googlers). Bu soru, görebildiğim kadarıyla, daha önce SO üzerinde hiç sorulmamıştı ve bunun, bazı yüksek kaliteli cevaplar üreteceğine inanıyorum. –
Kağıdın 2. Bölümü [Kalibrasyonunuzu hazırlayın - Genel Programlama için Pratik Tasarım Kalıbı] (http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=0088DE3D75D657BE9F2B9E5D705232B3?doi=10.1.1.1.3176&rep=rep1&type= pdf) iyi motive edici bir örnek içerir. – ErikR