SORU
21 AĞUSTOS 2011, Pazar


Olmayan katı ve tembel yapar Nasıl farklı? -

Ben sık sık okudumtembelaynı şey değildirolmayan katıama aradaki farkı anlamak benim için zor. Onlargibi görünüyorbirbirinin yerine kullanılan ancak farklı anlamları olduğunu anlıyorum. Yardıma farkı anlamak seviniriz.

Bu yazı hakkında yayılmış olan bir kaç soru var. Bu yazının sonunda bu soruları özetleyeyim. Birkaç örnek parçacıkları var, onları test etmedim, ben sadece kavram olarak lanse etti. Onları arıyorum kurtarmak için ekledi tırnak var. Belki birisi daha sonra aynı soru ile yardımcı olacaktır.

Olmayan Katı Def:

F fonksiyonu, bir nonterminating için uygulanan katı olduğu söyleniyor ifade, aynı zamanda sonlandırmak için başarısız olur. Diğer bir deyişle, f katıdır f bot değerini ıff|. Çoğu programlama dilleri, fonksiyonları katıdır. Ama bu çok Haskell. Basit olarak örneğin, const1, sabit 1 fonksiyonu tarafından tanımlanan göz önünde bulundurun:

= 1 x const1

Haskell içinde const1 bot değeri 1'dir. İşlevsel olarak, o konuşmayı const1 "" bağımsız değişkeninin değeri hiç girişiminde gerekmez onu değerlendirmek ve bu yüzden hiç bir nonterminating takılır hesaplama. Bu nedenle, non-sıkı fonksiyonları da denir "tembel işlevleri", ve onların argümanları değerlendirmek için şöyle dedi:"", tembel ya da "ihtiyacım var".

-A Gentle Introduction To Haskell: Functions

Gerçekten bu tanımı gibi. Kesin anlamak için bulabildiğim en iyisi gibi görünüyor. const1 x = 1 tembel de?

Non-katılık (matematiksel terim için bu azalma anlamına geliyor değerlendirme),. dışarıdan devam eder

eğer (a (b*c)) sonra ilk varsa azaltın , sonra düşürür iç (b*c).

-Haskell Wiki: Lavy vs non-strict

Haskell Wiki gerçekten kafamı karıştırdı. Sipariş hakkında ne diyorlar ama (a (b*c)) _|_ pastı olmayan-kesinlikle değerlendirmeniz nasıl görmek için başarısız anlıyorum?

Olmayan katı bir değerlendirme, bir işlev için bağımsız değişken değil değerlendirilir aslında fonksiyonun değerlendirilmesinde kullanılan sürece.

Kilise kodlama altında, operatörlerin tembel değerlendirme dışı katı haritalar fonksiyonlarının değerlendirilmesi; bu nedenle, olmayan katı değerlendirme. sık sık olarak anılacaktır "". tembel Birçok dilde Boolean ifadeler kullanın olmayan katı Değerlendirme Formu-kısa devre değerlendirme, nereye denir değerlendirme net belirlenmesi mümkün olduğunca çabuk döner Boolean neden olur — bölücü bir ifade örneğin, nerede doğrudur karşılaştı, ya da birleşik bir ifadesi olarak nerede yanlış karşılaştı, ve benzeri. Koşullu ifadeleri de çok kullanırım nerede değerlendirme tembel değerlendirme gibi kısa bir zamanda kesin olarak döndürür şube neden olur.

-Wikipedia: Evaluation Strategy

Tembel Def:

Tembel değerlendirme, diğer taraftan, sadece bir değerlendirme anlamına gelir sonuçları (not vardiyada ihtiyaç duyulduğu ifade """") değerlendirme. azaltma Değerlendirme bir motor gördüğünde çok ifade thunk veri yapısı ne olursa olsun değerleri içeren oluşturur bu ifade, artı bir işaretçi değerlendirmek için gereklidir ifadenin kendisi. Sonuç aslında değerlendirme gerektiğinde motor ifadeye çağırır ve sonra ile thunk değiştirir gelecekte başvurmak için iyi bir sonuç. ...

Belli ki bir thunk ve bir arasında güçlü bir örtüşme var kısmen değerlendirip ifade. Çoğu durumda, dolayısıyla hüküm "" ve tembel "non-sıkı" eş anlamlı. Ama o kadar da değil.

-Haskell Wiki: Lavy vs non-strict

Bu Haskell belirli bir cevap gibi görünüyor. Alıyorumtembeldemek thunkolmayan katıdemek kısmi değerlendirme. Bu karşılaştırma çok basitleştirilmiş. Yoktembelher zaman thunk yaniolmayan katıher zaman kısmi değerlendirme.

Programlama dili teorisi, tembel değerlendirme veya1 arama ihtiyacı bir ifadenin değerlendirmesi geciktirir değerlendirme stratejisi değeri aslında (olmayan katı değerlendirme) gerekli olduğu kadar ve aynı zamanda tekrarlanan değerlendirmeler (paylaşım) kaçının.

-Wikipedia: Lazy Evaluation

Zorunlu Örnekler

İnsanların çoğu fonksiyonel bir dil öğrenme zorunluluğu programlama unutmak demek biliyorum. Ancak, eğer bu hak bilmek olmayan katı, tembel, her iki ya da ne kadar istiyorum? En azından tanıdık bir şey sağlayacaktır.

Kısa Devre

f1() || f2()

C#, Python ve diğer diller "e" . verim

public static IEnumerable Power(int number, int exponent)
{
    int counter = 0;
    int result = 1;
    while (counter   < exponent)
    {
        result = result * number;
        yield return result;
    }
}

-MSDN: yield (c#)

Geri aramaları

int f1() { return 1;}
int f2() { return 2;}

int lazy(int (*cb1)(), int (*cb2)() , int x) {
    if (x == 0)
        return cb1();
    else
        return cb2();
}

int eager(int e1, int e2, int x) {
    if (x == 0)
         return e1;
    else
         return e2;
}

lazy(f1, f2, x);
eager(f1(), f2(), x);

Soru

Cevap tüm bu kaynaklar ile önümde olduğunu biliyorum, ama bunu idrak edemiyorum. Bu tanımı kolayca örtük veya açık olarak atlamamış gibi görünüyor.

Bir sürü soru var biliyorum. İlgili olduğunu düşündüğünüz her türlü cevap için çekinmeyin. Tartışma için sorular eklendi.

  • const1 x = 1 da tembel mi?
  • Nasıl "" non-sıkı? içe doğru değerlendirme. İçe gereksiz ifadeler azalma, const1 x = 1 gibi verir diye mi? İndirim tembel tanımına uygun görünüyor.
  • Yoktembelher zaman demekthunkveolmayan katıher zaman demekkısmi değerlendirme? Bu sadece bir genelleme mi?
  • Aşağıdaki zorunluluk kavramları Tembel Olmayan Sıkı, her İki ya da Ne?
    • Kısa Devre
    • Verim kullanarak
    • Geçen gecikme veya yürütme önlemek için geri Aramalar
  • tembelbir alt kümesiolmayan katıya da tam tersi, ya da onlar birbirini dışlayan. Örneğin mümkün olacakolmayan katıolmadantembelyatembelolmadanolmayan katı?
  • Haskell olmayan katılık tembellik ederek elde mi?

ÇOK teşekkür ederim!

CEVAP
21 AĞUSTOS 2011, Pazar


Olmayan katı ve tembel, ise gayrı resmi olarak değiştirilebilir, tartışma farklı etki alanları için geçerli.

Olmayan katısemantics ifade eder: bir ifadenin matematiksel anlamı. Hangi olmayan katı uygulanır dünyanın bir işlev, bellek kullanımı, ya da bir bilgisayar bile çalışan zaman kavramı yok. Sadece etki alanında hangi tür codomain değerleri için Göster ne hakkında konuşuyor. Özellikle, birkatıfonksiyon değerini göster &fail gerekir; ("alt" -- bu konuda daha fazla bilgi için semantik yukarıdaki bağlantıya bakın)&;; suçlu olmayan katı bir işlev bunu yapmak için izin verilmez.

Tembeloperasyonel davranış gösterir: kod gerçek bir bilgisayarda yürütülür. En programcılar programlarını işlevsel olarak düşün, bu senin ne düşündüğünü açıklıyor. Tembel değerlendirme değeri yürütülen ilk söz ile yerini alan uygulama kodu thunk -- işaretçileri kullanarak ifade eder. Non-semantik sözcükleri buraya dikkat: "", "first time", "". idam işaretçi

Tembel değerlendirme kavramları birbirine çok yakın görünüyor neden olan non-sıkı semantik meydana getiriyor. Ama FUZxxl belirttiği gibi, tembellik olmayan katı semantik uygulamak için tek yol değildir.

Eğer bu ayrım hakkında daha fazla öğrenme ilgilenen varsa, ben çok yukarıdaki linki tavsiye ederim. Onu okuyordu bilgisayar programları anlamını benim kavramında bir dönüm noktası.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • J Medema

    J Medema

    11 EKİM 2006
  • Joshua Kywn

    Joshua Kywn

    17 Mayıs 2010
  • StalkerJS

    StalkerJS

    15 HAZİRAN 2010