So bemerkte ich, dass nach n = 20 die in LearnYouAHaskell (unten) angegebene faktorielle Funktion aufgrund des endlichen Arbeitsbereichs des Int-Typs ausfällt.Der Typ einer Funktion hängt von der Eingabe ab
factorial :: Int -> Int
factorial 0 = 1
factorial n * factorial (n-1)
Mit factorial :: Integer -> Integer
behebt das Problem schön, aber es brachte die Frage in den Sinn. Angeblich ist Integer etwas langsamer als Int, also idealerweise (und ich weiß, dass ich hier ein paar Pfennige kneife). Ich möchte, dass meine Fakultät nur auf Integer zurückgreift, wenn die Eingabe größer als 20 ist und den Typ Int->Int
für die kleineren Zahlen behält. Scheint, dass es eine elegante Lösung dafür geben sollte, wenn-then-else oder Wächter, aber weiter in syntaktischen Pfeffer (Fehlermeldungen)
In GHC haben wir das ["Integer"] (http://hackage.haskell.org/package/integer-gmp-1.0.0.0/docs/ GHC-Integer-GMP-Internals.html # t: Integer) ist genau ein Summentyp, wobei kleine Werte eine effizientere Darstellung verwenden. Das Hinzufügen einer weiteren Summe würde die Situation wahrscheinlich noch verschlimmern. – chi
Ich schreibe lieber 'selectiveFactorial :: Int -> Integer; selektivesFaktor i | i <20 = von Integral (Fakultät i) | sonst = faktoriell (fromIntegral i) '. – user3237465