2016-11-16 29 views
5

ilk soru içindeki uzunluğu gelen Haskell üzerinde bir noob doğan hiçbir örneği, bu yüzden this Haskell sorusu 6 numaralı oynuyordumKatlanabilir burada ve tamamen lambda

:) benimle tür

egzersizleri lütfen ve sonunda bu kodu

combinations gr lis = filter clean $ sequence $ replicate gr lis 
where 
    clean string 
     | total > gr = False 
     | otherwise = True 
     where total = sum [ rpt c string | c <- string] 
    rpt chr list = length $ filter (== chr) list 

i karakter tekrarlanır sayısını sayar fonksiyonu 'rpt' olduğu vurgulanır ister parçası ile çözelti (veya benzer bir şey umarım) geldi exampl için bir dize e: "aaba" -> [3313] (3 3 kez repeates mektubunda, gelir) "aaccva" -> Bir lambda fonksiyonu yapmaya çalıştı daha sonra [332213]

ve Bu sonuçlanan bir harita:

rpt chr list = map (\chr -> length $ filter (== chr)) list 

ve birinci GHCi de

buna izin vermek FlexibleContext kullanmak söyledi fakat ben o zaman eğer o verir: burada

<interactive>:7:1: 
No instance for (Foldable ((->) [Char])) 
    arising from a use of ‘rpt’ 
In the expression: rpt 'a' string 
In an equation for ‘it’: it = rpt 'a' string 

ve bi'şey sıkışmış, var Neler olduğunu anlayamadım ... bu işlevi düzeltmek için ne gerekiyor? Bir acemi olarak

rpt chr list = map (\chr -> length $ filter (== chr) list) list 

, ben FlexibleContexts ait GHCi önerisini görmezden olacaktır:

+1

Bu, başlangıç ​​seviyeniz için yapısal olarak oldukça iyidir, bunun için bir çakmağınız var. – luqui

+0

Bu durumlarda, genel bir tavsiye olarak, kafa karıştırıcı bir hata mesajı aldığınızda, türlerin ne olması gerektiğini düşündüğünüzüzü belirten tür ek açıklamaları eklemeye başlayın. . Bu, * önemli iletileri * iyileştirecektir. Aslında, bu tür hataları mümkün olan en kısa sürede yakalamak için tüm üst düzey işlevler için tür açıklamaları sağlamak genellikle iyi bir uygulamadır. –

+0

Bu yeni başlayanlar için iyidir. Bir çift not: 1) 'temiz dizgiyi = toplam <= gr nerede ...' koruyucular kullanacağından ya da eğer geri dönecek olursanız true/false daha karmaşık görünüyorsa 2) kombinasyonlar için algoritmanız görünüyor doğru ama yetersiz: çok sayıda aday oluşturursunuz ve daha sonra bunları filtrelemeniz gerekir. Bunu göz önünde bulundurun: 'x:' den x'leri atlayarak (ve x'lerden tüm k öğelerini alarak) veya x'i seçerek (ve daha sonra xs'den yalnızca k-1 öğelerini alarak) k öğelerini x: xs'den seçebilirsiniz. . – chi

cevap

5

Muhtemelen, ayrıca filter bir argüman olarak list eklemem gerekiyor bu yüzden oo, list üzerinde filtre kod çalışması niyetinde . Bu, sahip olduğunuzdan (veya No instance for (Num (Int -> Bool)) gibi diğer kafa karıştırıcı şeylerden) oluşan hata mesajlarını üretmekten daha sık değildir.

+0

Öneri: Aslında istediği düzeltme, eşleştirilen işlevin sonuna 'liste' eklemekti ('map (\ chr -> length $ filter (== chr) listesindeki gibi)' listesindeki gibi). Kodunuz bir işlev listesi oluşturur; Benim bir sayı listesi üretiyor. –

+0

@DanielWagner Sanırım haklısınız. Çözümü buna göre değiştireceğim. – Alec

+0

vay bu kadar basit bir çözüm ... teşekkürler @Alec bana çok yardımcı oldunuz! – iPizarro12