Construido en la función factorial en Haskell

Sé que esto suena como una pregunta estúpida, pero aquí es: ¿hay un built-in factorial en Haskell?

Google me da tutoriales sobre Haskell explicar cómo puedo aplicar yo mismo, y yo no podía encontrar nada en Hoogle. No quiero volver a escribirla cada vez que lo necesito.

Puedo usar product [1..n] como un reemplazo, pero hay un cierto Int -> Int factorial la función incorporada?

  • Bueno, no hay ninguna «built-in» operador (es decir, parte de la norma preludio) para factoriales…
  • Altamente improbable. La mayoría, si no todas las personas que necesitan una función factorial (en cualquier lenguaje de programación) necesita para una tarea/ejercicio, no para ningún trabajo real. Si realmente necesita esto, sólo tiene que codificar un conjunto de todos los factoriales de los números por debajo de maxBound :: Int (232 o más que 264) sería más fácil.
  • Y fuera de preludio? No veo por qué factorial puede ser sólo un ejercicio. Se trata de una útil y genérica de la operación.
  • Para las risas, consulte willamette.edu/~fruehr/haskell/evolution.html
InformationsquelleAutor Simon Bergot | 2011-07-24

7 Kommentare

  1. 50

    Aunque es comúnmente usado para los ejemplos, la función factorial no es del todo útil en la práctica. Los números crecen muy rápidamente, y la mayoría de problemas que incluyen la función factorial puede (y debe) ser calculada de manera más eficiente.

    Un ejemplo trivial es la computación de los coeficientes binomiales. Mientras que es posible definir como

    choose n k = factorial n `div` (factorial k * factorial (n-k))

    es mucho más eficiente a no utilizar factoriales:

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

    Así que, no, no está incluido en el estándar de preludio. Tampoco es que la secuencia de Fibonacci, la función de Ackermann, o muchas otras funciones que aunque teóricamente es muy interesante, no se utilizan comúnmente suficiente, en la práctica, garantiza un lugar en las bibliotecas estándar.

    Que se dice, hay muchas bibliotecas matemáticas disponibles en Hackage.

    • Entiendo que esto. Pero cuando se cuentan cosas, puede ser útil disponer de funciones canónicas como factorial, binomio coeffs, etc para simplificar el código. Estoy de acuerdo en que no se necesita este tipo de funciones todos los días, pero aún así…
    • Tenga en cuenta que choose es una función integrada en el paquete de Prueba.QuickCheck, así que aunque este ejemplo funciona siempre de la Prueba.QuickCheck no está en uso, es una buena práctica para el nombre choose' o algo totalmente diferente.
    • Calcular el factorial es muy útil en la generación de permutaciones
    • Prueba.QuickCheck puede ser un importante paquete para su flujo de trabajo (y de otros), pero no es dueño de choose, que ha sido utilizado por los matemáticos durante mucho más tiempo.
    • El uso de calificación para la desambiguación, no arbitraria extensiones de nombre.
  2. 5

    No, pero fácilmente puede escribir uno. Si usted está preocupado acerca de tener que reescribir la función cada vez que sea necesario, siempre se puede escribir como parte de un módulo o de una biblioteca (dependiendo de cuánto usted quiere tomar esto, de cualquier forma muchas otras funciones similares que tienen). De esa manera usted sólo tendrá que escribir una vez, y rápidamente se puede tirar en cualquier otro de los proyectos cuando los necesite.

    • gracias. Se siente extraño que haskell no tiene este tipo de función en una biblioteca matemática.
  3. 2

    Usted tiene el product función que está en el estándar de preludio. Combinado con rangos que puede obtener una función factorial con el mínimo esfuerzo.

    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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea