SORU
27 NİSAN 2009, PAZARTESİ


Neden bu Haskell kodu "sonsuz" hata üretir?

Haskell için yeni ve "tür" anlam veremem hata. olamaz inşa sonsuz bir karşı karşıyayım

Aslında, bunun ötesinde, yok olmuş bulur iyi bir açıklama, ne bu hata bile olabilir. o zaman gelir misin diye öte, benim temel soru ve açıklar "sonsuz tip" hata yaparım çok teşekkür ederim.

İşte kod:

intersperse :: a -> [[a]] -> [a]

-- intersperse '*' ["foo","bar","baz","quux"] 
--  should produce the following:
--  "foo*bar*baz*quux"

-- intersperse -99 [ [1,2,3],[4,5,6],[7,8,9]]
--  should produce the following:
--  [1,2,3,-99,4,5,6,-99,7,8,9]

intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:y:xs) = x:s:y:intersperse s xs

Ve burada hata yorumlayıcı içine yüklemek için çalışıyor:

Başlangıcı>:yük ./bölüm.3.son.gerçek.dünya.haskell.egzersizleri.hs [1 1] Ana Derleme ( bölüm.3.son.gerçek.dünya.haskell.egzersizleri.hs, yorumlanmış )

bölüm.3.son.gerçek.dünya.haskell.egzersizleri.:147:0:hs Kontrol oluşur: sonsuz yazamaz inşa: = [a] Tip(ler) için genelleme `serpmek' Dolu başarısız modülleri: yok.

Teşekkürler.

EDİT: cevaplar için, kodu düzelttikten ve ben de "" hata içinde Haskell: . sonsuz türü ile ilgili genel bir kural var Teşekkürler

Kod düzeltildi

intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) =  x    s:intersperse s xs

Sorun neydi:

Yazın imzamı serpmek için ikinci bir parametre olduğunu belirtirlistenin listeler. Ben desen eşleşen zaman, bu nedenle, karşı "(x:y:X)", x ve y oldu . s ^strong>listeler. Ve henüz x tedavi ve öğeleri, listeler gibi y ediyordum.

"Sonsuz tip" hata: . ile ilgili kılavuz

Çoğu zaman, ne zaman sen almak bu hata, unuttun türlerinin çeşitli Değişkenler ile uğraştığımızı ve teşebbüs için kullandıkları bir değişken olarak başka bir tip daha. Ne tip herşeydir karşı kullanıyorsun nasıl dikkatle bakın, ve bu genellikle sorunu ortaya çıkarmak olacaktır.

CEVAP
27 NİSAN 2009, PAZARTESİ


Sorun listeleri iken x davranıyorsun son tümcesi ve elemanları olarak y. Bu çalışır:

intersperse _ [] = []
intersperse _ [x] = x 
intersperse s (x:y:xs) = x    [s]    y    intersperse s xs

Hata nedeniyle oluşur sonsuz tip : operatör tür ->[a] ->[a], [a] olarak ele ->->bir sonsuz iç içe geçmiş bir liste yani, [a], [a] tespit edilmesi gerektiği anlamına gelir. (Ne yani, her neyse) izin verilmez.

Düzenleme:ayrıca yukarıdaki kodda bir hata var. Olmalıdır:

intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) = x    [s]    intersperse s xs

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HuskyStarcraft

    HuskyStarcra

    4 HAZİRAN 2009
  • Malwarebytes

    Malwarebytes

    22 Temmuz 2007
  • Tylerron

    Tylerron

    6 AĞUSTOS 2006