Quindi notato che dopo n = 20 la funzione fattoriale data a LearnYouAHaskell (sotto) craps fuori a causa della gamma lavoro finito di tipo Int.Portando il tipo di funzione dipendono ingresso
factorial :: Int -> Int
factorial 0 = 1
factorial n * factorial (n-1)
Utilizzando factorial :: Integer -> Integer
risolve il problema bene, ma ha portato alla mente la questione. Presumibilmente Integer è leggermente più lento Int così idealmente (e so che sto intrappolando i penny qui) vorrei la mia funzione fattoriale di ricorrere solo per intero quando l'ingresso è maggiore di 20 e mantenere il tipo di Int->Int
per i numeri più piccoli. Sembra che ci dovrebbe essere una soluzione elegante per questo utilizzando if-then-else o guards, ma continuare a correre in pepe sintattico (messaggi di errore)
In GHC abbiamo quello ['Integer'] (http://hackage.haskell.org/package/integer-gmp-1.0.0.0/docs/ GHC-Integer-GMP-Internals.html # t: Integer) è esattamente un tipo di somma, con valori piccoli che utilizzano una rappresentazione più efficiente. Quindi, aggiungere un'altra somma in cima probabilmente renderebbe le cose peggiori. – chi
Preferisco scrivere 'selectiveFactorial :: Int -> Integer; selectiveFactorial i | i <20 = fromIntegral (fattoriale i) | altrimenti = fattoriale (daIntegrale i) '. – user3237465