SORU
15 HAZİRAN 2011, ÇARŞAMBA


Neden boş bir liste's `kafa` kaza (veya neden yok't *boş bir liste dönmek*) Haskell? (Dil felsefesi)

Diğer potansiyel katkı için not: soyut ya da matematiksel gösterimler noktası yapmak için kullanmak için çekinmeyin. Eğer cevabınız belirsiz bulursam aydınlatılması için soracağım, ama aksi takdirde rahat bir şekilde kendini ifade etmek için çekinmeyin.

Daha net olmak gerekirse: bendeğilbir "güvenli" ne head seçimi head, özellikle son derece anlamlı. Sorunun et head ve bağlam sağlamak için hizmet veren head', tartışma izler.

Ben hack ile Haskell için bir kaç aydır (nokta o var olmak benim ana dili), ama ben kuşkusuz bilgili hakkında bazı daha gelişmiş kavramları ne de ayrıntıları dili felsefesi (gerçi ben daha istekli öğrenirler). Benim sorum o zaman bu kadar felsefe gibi teknik bir iş ve ben bunun farkında değil sürece) değildir.

Bu örnek için, head konuşuyorum.

Anlarsın hayal gibi

Prelude> head []    
*** Exception: Prelude.head: empty list

Bu head :: [a] -> a izler. Yeterince adil. Belli ki bir kısmı (el-wavingly) tür bir öğe dönmek. Ama aynı zamanda, basit önemsiz () tanımlamak için

head' :: [a] -> Maybe a
head' []     = Nothing
head' (x:xs) = Just x

Bazı ifadeler here yorum bu bölümde bazı küçük tartışma gördüm. Özellikle, bir Alex Stangl diyor

'Yapmak için iyi bir nedeni vardır her şeyi "" ve ön şartları ihlal edildiği zaman. istisnalar atmak için' güvenli

Mutlaka bu iddia, ama "iyi nedenler". ne kadar meraklı olduğumu sorgulamıyorum.

Paul Johnson diyor ayrıca

'Mesela tanımlayabilirsiniz "safeHead :: [a] ->Belki", ama şimdi yerine ya da boş bir liste işleme ya böyle bir şey olamaz, senin halletmek zorunda" ya da ispat olamaz.' "hiçbir Şey kanıtlayan bir

Bu yorum okudum bu sesi bu zorluk içinde kayda değer bir artış şey//karmaşıklık gösteriyor, ama oraya koyuyor ne kavramak emin değilim.

Steven Pruzina söylüyor (2011, az)

"Daha derin bir nedeni vardır e.'baş' çarpışma kanıtı olamaz. g Polimorfik olması henüz boş bir liste işlemek için, 'kafa' her zaman belirli bir boş listesinden eksik olan türde bir değişken dönmek gerekir. Eğer Haskell yapabileceği eğer anlaşılmaz şeyler olur...".

Olur polimorfizmi boş liste işleme izin vererek kaybetti? Eğer öyleyse, nasıl ve neden? Bu belli ki özel durumlar vardır?Bu bölüm pek fazla @O'Connor Russell ile cevap verdi.Başka düşüncesi, elbette takdir edilir.

Netlik ve öneri dikte olarak düzenleyeceğim. Herhangi bir düşünce, makale, vb., en takdir edilecek sağlayabilir.

CEVAP
15 HAZİRAN 2011, ÇARŞAMBA


Polimorfizmi boş vererek kaybolur liste işleme? Eğer öyleyse, nasıl ve neden? Belirli durumlarda var olan olacaktır bu açık olun?

head ücretsiz teoremi belirtir

f . head = head . $map f

[] Bu teoremi uygulamak anlamına gelir

f (head []) = head (map f []) = head []

Bu teoremi her f özellikle const True const False tutmak gerekir tutmak gerekir. Bu anlamına gelir

True = const True (head []) = head [] = const False (head []) = False

Böylece head düzgün biçimli ve head [] toplam değeri olsaydı, o zaman True False eşit olur.

PS. Ben başka bir yorum hakkında arka plan için senin sorunun etkisi varsa bir ön şartı olan listenizde olmayan boş o zaman zorlamak kullanarak boş olmayan bir liste yazın fonksiyon imza yerine bir liste.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • echifitness

    echifitness

    9 Kasım 2008
  • Need for Speed

    Need for Spe

    8 ŞUBAT 2006