Di recente ho seguito la guida Learn You a Haskell for Great Good e come pratica volevo risolvere il problema del Project Euler 5 con esso, che specifica:
Qual è il numero positivo più piccolo che è uniformemente divisibile per tutti i numeri da 1 a 20?
Ho deciso di scrivere prima una funzione per determinare se un determinato numero è divisibile per questi numeri:
divisable x = all (\y -> x `mod` y == 0)[1..20]
Quindi ho calcolato il più piccolo usando head
:
sm = head [x | x <- [1..], divisable x]
E infine ha scritto la riga per visualizzare il risultato:
main = putStrLn $ show $ sm
Sfortunatamente, il completamento ha richiesto circa 30 secondi. Fare la stessa cosa con i numeri da 1 a 10 produce un risultato quasi immediatamente, ma anche in questo caso il risultato è molto più piccolo della soluzione da 1 a 20.
L'ho risolto in precedenza in C e lì il risultato per 1 a 20 è stato anche calcolato quasi istantaneamente. Questo mi porta a credere che sto fraintendendo come interpretare questo problema per Haskell. Ho cercato le soluzioni degli altri e ho trovato questo:
main = putStrLn $ show $ foldl1 lcm [1..20]
Abbastanza giusto, questo utilizza una funzione integrata, ma perché il risultato finale è molto più lento quando lo fai da solo? I tutorial là fuori ti spiegano come usare Haskell, ma non vedo molto aiuto nel trasformare gli algoritmi in codice veloce.