Geçenlerde Büyük İyi için Haskell Öğrenin kılavuzundan geçiyorum ve uygulama olarak Project Euler Problem 5'i onunla çözmek istedim , bu da şunları belirtiyor:
1'den 20'ye kadar olan tüm sayılarla eşit olarak bölünebilen en küçük pozitif sayı nedir?
Önce belirli bir sayının bu sayılarla bölünebilir olup olmadığını belirleyen bir işlev yazmaya karar verdim:
divisable x = all (\y -> x `mod` y == 0)[1..20]
Sonra kullanarak en küçük olanı hesapladım head
:
sm = head [x | x <- [1..], divisable x]
Sonunda sonucu görüntülemek için satır yazdı:
main = putStrLn $ show $ sm
Ne yazık ki bu işlemin tamamlanması yaklaşık 30 saniye sürdü. Aynı şeyi 1 ila 10 sayıları ile yapmak neredeyse bir sonuç verir, ancak daha sonra sonuç 1 ila 20'lik çözeltiden çok daha küçüktür.
Daha önce C'de çözdüm ve orada 1'den 20'ye kadar olan sonuç neredeyse anında hesaplandı. Bu beni Haskell için bu sorunu nasıl yorumlayacağımı yanlış anladığımı düşünmeye itiyor. Başkalarının çözümlerini inceledim ve buldum:
main = putStrLn $ show $ foldl1 lcm [1..20]
Yeterince adil, bu yerleşik bir işlev kullanıyor, ancak sonuç bunu kendiniz yaparken neden bu kadar yavaş? Orada öğreticiler Haskell nasıl kullanılacağını söyler, ancak algoritmaları hızlı koda dönüştürme konusunda çok yardım görmüyorum.