Fonction factorielle intégrée à Haskell

je sais que cela ressemble à une question stupide, mais la voici: Est-ce qu'il y a 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 réécrire à chaque fois que j'en ai besoin.

je peux utiliser product [1..n] comme un remplacement, mais est-il vrai Int -> Int factorielle fonction intégrée?

30
demandé sur hammar 2011-07-24 17:04:39

7 réponses

même si elle est couramment utilisée pour des exemples, la fonction factorielle n'est pas très utile dans la pratique. Les nombres croissent 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. Alors qu'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 les factorielles:

choose n 0 = 1
choose 0 k = 0
choose n k = choose (n-1) (k-1) * n `div` k 

Donc, non, il n'est pas inclus dans le prélude standard. Ni L'ordre de Fibonacci, la fonction Ackermann, ou de nombreuses autres fonctions qui, bien que théoriquement intéressant ne sont pas utilisés assez souvent dans la pratique pour justifier une place dans les bibliothèques standard.

cela étant dit, il y a de nombreuses bibliothèques de mathématiques disponibles sur Hackage.

47
répondu hammar 2011-07-24 13:27:42

Non, mais vous pouvez facilement écrire. Si vous êtes soucieux d'avoir à réécrire la fonction à chaque fois que vous en avez besoin, vous pouvez toujours l'écrire comme partie d'un module ou d'une bibliothèque (selon la distance que vous voulez prendre cette fonction, le nombre d'autres fonctions similaires que vous avez). De cette façon, vous avez seulement besoin de l'écrire une fois, et peut rapidement tirer à d'autres projets quand vous en avez besoin.

5
répondu Justin Ethier 2011-07-24 13:09:53

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].

http://hackage.haskell.org/package/exact-combinatorics

5
répondu K. Takusagawa 2016-04-17 09:59:21

Essayez Hayoo! rechercher (lien sur le haut de hackage); il est venu avec ceci, par exemple

http://hackage.haskell.org/packages/archive/statistics/latest/doc/html/Statistics-Math.html#v:factorial

4
répondu gatoatigrado 2011-07-25 00:24:04

Vous avez product fonction qui est dans le prélude standard. Combiné avec des gammes, vous pouvez obtenir une fonction factorielle avec un effort minimal.

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
2
répondu alopez 2013-07-27 16:08:59
fac = product . flip take [1..]
2
répondu Christian Brolin 2016-04-25 21:35:51

si vous cherchez une expression lambda, alors vous pouvez toujours utiliser le classique fix (\f x -> if x == 0 then 1 else x * (f (x - 1))).

0
répondu sanjoyd 2011-07-24 17:13:51