Je sais que cela ressemble à une question stupide, mais la voici: y a-t-il un factoriel intégré à Haskell?
Google me donne des tutoriels sur Haskell expliquant comment je peux l'implémenter moi-même, et je n'ai rien trouvé sur Hoogle. Je ne veux pas le réécrire chaque fois que j'en ai besoin.
Je peux utiliser product [1..n]
en remplacement, mais existe-t-il un vrai Int -> Int
fonction factorielle intégrée?
Même si elle est couramment utilisée pour des exemples, la fonction factorielle n'est pas du tout utile dans la pratique. Les nombres augmentent très rapidement et la plupart des problèmes qui incluent la fonction factorielle peuvent (et devraient) être calculés de manière plus efficace.
Un exemple trivial est le calcul des coefficients binomiaux. S'il est possible de les définir comme
choose n k = factorial n `div` (factorial k * factorial (n-k))
il est beaucoup plus efficace de ne pas utiliser de factorielles:
choose n 0 = 1
choose 0 k = 0
choose n k = choose (n-1) (k-1) * n `div` k
Donc, non, ce n'est pas inclus dans le prélude standard. La séquence de Fibonacci, la fonction Ackermann ou de nombreuses autres fonctions qui, bien que théoriquement intéressantes, ne sont pas suffisamment utilisées dans la pratique pour justifier une place dans les bibliothèques standard ne le sont pas non plus.
Cela étant dit, il existe de nombreuses bibliothèques mathématiques disponibles sur Hackage .
La meilleure implémentation de factorielle que je connaisse dans Hackage est Math.Combinatorics.Exact.Factorial.factorial
dans le exact-combinatorics
paquet. Il utilise un algorithme asymptotiquement plus rapide que product [1..n]
.
Non, mais vous pouvez facilement en écrire un. Si vous êtes inquiet de devoir réécrire la fonction chaque fois que vous en avez besoin, vous pouvez toujours l'écrire dans le cadre d'un module ou d'une bibliothèque (selon la distance que vous souhaitez parcourir, le nombre d'autres fonctions similaires que vous avez). De cette façon, vous n'avez besoin de l'écrire qu'une seule fois et pouvez rapidement l'intégrer à tout autre projet lorsque vous en avez besoin.
Essayez Hayoo! rechercher (lien en haut du hackage); il est venu avec cela, par exemple
fac = product . flip take [1..]
Vous avez la fonction product
qui est dans le prélude standard. Combiné avec des gammes, vous pouvez obtenir une fonction factorielle avec un minimum d'effort.
factorial n = product [n, n-1 .. 1]
nCr n r = n' `div` r'
where
-- unroll just what you need and nothing more
n' = product [n, n-1 .. n-r+1]
r' = factorial r
Si vous recherchez une expression lambda, vous pouvez toujours utiliser la classique fix (\f x -> if x == 0 then 1 else x * (f (x - 1)))
.
fact n = if n == 0 then 1 else n * fact(n-1)
fact n = foldl(*) 1 [1..n]
fact n = product [1..n]
Vous pouvez choisir soit