Saya baru-baru ini telah melalui panduan Pelajari Anda Haskell untuk Great Good dan sebagai praktik saya ingin menyelesaikan Project Euler Problem 5 dengan itu, yang menentukan:
Berapakah angka positif terkecil yang secara merata dapat dibagi oleh semua angka dari 1 hingga 20?
Saya memutuskan untuk terlebih dahulu menulis fungsi yang menentukan apakah angka yang diberikan dapat dibagi dengan angka-angka ini:
divisable x = all (\y -> x `mod` y == 0)[1..20]
Lalu saya menghitung yang terkecil menggunakan head
:
sm = head [x | x <- [1..], divisable x]
Dan akhirnya menulis baris untuk menampilkan hasilnya:
main = putStrLn $ show $ sm
Sayangnya ini membutuhkan waktu sekitar 30 detik untuk menyelesaikannya. Melakukan hal yang sama dengan angka 1 hingga 10 menghasilkan hasil segera, tetapi sekali lagi hasilnya jauh lebih kecil daripada solusi untuk 1 hingga 20.
Saya menyelesaikannya sebelumnya di C dan di sana hasilnya selama 1 hingga 20 juga dihitung hampir secara instan. Ini membuat saya percaya bahwa saya salah mengerti bagaimana menafsirkan masalah ini untuk Haskell. Saya melihat melalui solusi orang lain dan menemukan ini:
main = putStrLn $ show $ foldl1 lcm [1..20]
Cukup adil, ini menggunakan fungsi bawaan, tetapi mengapa hasil akhirnya jauh lebih lambat saat melakukannya sendiri? Tutorial di luar sana memberi tahu Anda cara menggunakan Haskell, tapi saya tidak melihat banyak bantuan dengan mengubah algoritma menjadi kode cepat.