Recentemente ho esaminato la ti ho imparato una guida Haskell per il massimo e come pratica ho voluto risolvere Project Euler Problem 5 con esso, che specifica:
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
Ho deciso di scrivere prima una funzione per determinare se un dato numero è divisibile con questi numeri:
divisable x = all (\y -> x 'mod' y == 0)[1..20]
Poi ho calcolato il più piccolo usando head
:
sm = head [x | x <- [1..], divisable x]
E alla fine ha scritto la riga per visualizzare il risultato:
main = putStrLn $ show $ sm
Purtroppo ci sono voluti circa 30 secondi per terminare. Fare la stessa cosa con i numeri da 1 a 10 produce un risultato quasi immediatamente, ma poi di nuovo il risultato è molto più piccolo della soluzione da 1 a 20.
L'ho risolto prima in C e il risultato per 1 a 20 è stato calcolato anche quasi istantaneamente. Questo mi porta a credere che sto fraintendendo come interpretare questo problema per Haskell. Ho esaminato le soluzioni degli altri e ho trovato questo:
main = putStrLn $ show $ foldl1 lcm [1..20]
Abbastanza corretto, questo usa una funzione built-in, ma perché il risultato finale è molto più lento quando lo fai da solo? Le esercitazioni là fuori ti dicono come usare Haskell, ma non vedo molto aiuto con la trasformazione degli algoritmi in codice veloce.