SORU
2 EKİM 2012, Salı


Neden seq kötü mü?

Haskell büyülü bir fonksiyon herhangi bir argüman alır seq adında var ve azaltırZayıf Head Normal Form(WHNF).

Kaynakları kim olduklarını hatırlamıyorum. [değil bir kaç okudum ^em>şimdibu iddia...] "seq kötü polimorfik". Ne onlar ""? kötü

Benzer şekilde, bir bağımsız değişken azaltır rnf işlevi vardırNormal Form(NF). Amabusınıf bir yöntemdir; rastgele türleri için çalışmaz. "Bana bir dil spec yerleşik ilkel, seq. benzer olarak bu sağlamak için değiştirebilir "açık gözüküyor Bu, muhtemelen, "" sadece sahip seq. daha da kötü olur Ne bu yani?

Nihayet, birileri önerilen vererek seq, rnf, par ve Benzerleri aynı türü id işlevi yerine const işlevi olarak, artık, bu da bir gelişmedir. Nasıl yani?

CEVAP
2 EKİM 2012, Salı


Bildiğim kadarıyla bir polimorfik seq fonksiyonudur kötü çünkü zayıflatır ücretsiz teoremleri ya da, başka bir deyişle, bazı eşitlik vardır geçerli olmayan seq artık geçerli seq. Örneğin, eşitlik

map g (f xs) = f (map g xs)

tüm fonksiyonlar için de geçerlidir g :: tau -> tau', xs :: [tau] ve tüm polimorfik fonksiyonları f :: [a] -> [a] listeler. Temel olarak, bu eşitlik f tek argüman listesindeki öğeleri yeniden düzenlemek veya damla öğeleri yinelenen ancak yeni unsurlar icat belirtir.

Dürüst olmak gerekirse, bu gibi unsurlar "/hata türü polimorfik olarak çalıştırma listesine hatası." non-sonlandırıcı bir hesaplama Ekle icat olabilir O, bu eşitlik zaten seq olmadan Haskell gibi bir programlama dili keser. Aşağıdaki fonksiyon tanımları denklem ters bir örnek sağlar. Temelde, Sol tarafta g "gizler" hata.

g _ = True
f _ = [undefined]

Denklemi çözmek için, g sıkı olmalı, yani bir hata için bir hata göster. Bu durumda, eşitlik yine tutar.

Eğer seq polimorfik bir operatör, denklem sonları tekrar eklerseniz, örneğin, aşağıdaki örnekleme sayacı bir örnektir.

g True = True
f (x:y:_) = [seq x y]

Eğer liste ** 29, düşünürsek

map g (f [False, True]) = map g [True] = [True]

ama, diğer taraftan

f (map g [False, True]) = f [undefined, True] = [undefined]

O O seq listenin belirli bir pozisyon eleman listedeki başka bir öğe definedness bağımlı yapmak için kullanabilirsiniz. Eşitlik yine g toplam ise tutar. Eğer ücretsiz teoremleri intereseted eğer hataları ile bir dil düşündüğünüz belirlemenizi sağlar free theorem generator ya seq ile bir dil bile bak. Ancak, bu olabilir gibi görünüyor daha az pratik alaka, seq sonları bazı dönüşümler kullanılan geliştirmek performans işlevsel programlar, örneğin, foldr/build füzyon başarısız bulunması seq. Eğer daha fazla intereseted seq, varlığında ücretsiz teoremleri hakkında ayrıntılar Free Theorems in the Presence of seq içine bir göz atın.

Dil eklendiğinde bir polimorfik seq bazı dönüşümler sonları bilinen olmuştu bildiğim kadarıyla. Ancak, althernatives dezavantajları da var. Eğer bir tür sınıf seq, temel eklerseniz eğer seq derinlerde bir yerde eklerseniz program türü sınıf kısıtlamaları bir sürü eklemek zorunda kalabilirsiniz. Ayrıca, zaten sabit olabilir alanı sızıntı olduğunu seq kullanarak bilinen olduğu gibi seq atlamak için bir seçenek olmamıştı.

Nihayet, bir şeyler kaçırabilirim, ama 46 ** tür seq bir operatör işe yarayacağını sanmıyorum. seq ipucu: eğer başka bir ifade normal form başına değerlendirildiğinde normal form kafasına bir ifadesi olarak değerlendirilir. seq 49 ** türü bir ifadenin değerlendirmesi başka bir yorumuna bağlıdır yapmanın yolu yok.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bcbauer

    bcbauer

    7 ŞUBAT 2007
  • Justin Davis

    Justin Davis

    14 Ocak 2008
  • Virtual Riot

    Virtual Riot

    19 Mayıs 2011