Ich habe vor kurzem den Leitfaden „ Lernen Sie eine Haskell für großartige Gutes“ durchgearbeitet und wollte in der Praxis das Projekt Euler-Problem 5 damit lösen , in dem Folgendes angegeben ist:
Was ist die kleinste positive Zahl, die durch alle Zahlen von 1 bis 20 gleichmäßig teilbar ist?
Ich habe mich dazu entschlossen, zuerst eine Funktion zu schreiben, die bestimmt, ob eine bestimmte Zahl durch diese Zahlen teilbar ist:
divisable x = all (\y -> x `mod` y == 0)[1..20]
Dann habe ich den kleinsten berechnet mit head
:
sm = head [x | x <- [1..], divisable x]
Und schließlich schrieb die Zeile, um das Ergebnis anzuzeigen:
main = putStrLn $ show $ sm
Leider dauerte dies etwa 30 Sekunden. Wenn Sie mit den Zahlen 1 bis 10 dasselbe tun, erhalten Sie fast sofort ein Ergebnis, aber das Ergebnis ist wiederum viel kleiner als die Lösung für 1 bis 20.
Ich habe es früher in C gelöst und dort wurde das Ergebnis für 1 bis 20 auch fast sofort berechnet. Dies lässt mich glauben, dass ich die Interpretation dieses Problems für Haskell missverstehe. Ich habe die Lösungen anderer Leute durchgesehen und Folgendes festgestellt:
main = putStrLn $ show $ foldl1 lcm [1..20]
Gut, dies verwendet eine eingebaute Funktion, aber warum ist das Endergebnis so viel langsamer, wenn Sie es selbst tun? In den Tutorials erfahren Sie, wie Sie Haskell verwenden, aber ich sehe keine große Hilfe bei der Umwandlung von Algorithmen in schnellen Code.