2010-05-25 38 views
18

Estoy aprendiendo Haskell. Pensé que esto produciría una función factorial ...bucle infinito en haskell? (novato)

(dentro de ghci)

Prelude> let ft 0 = 1 
Prelude> let ft n = n * ft (n - 1) 
Prelude> ft 5 

(bloquea de forma indefinida, hasta^C).

¿Puede alguien señalarme en la dirección correcta?

Gracias!

Respuesta

29

Las dos declaraciones separadas let se interpretan de forma independiente. Primero se define una función ft 0 = 1, y luego se define una nueva función ft n = n * ft (n - 1), sobrescribiendo la primera definición.

Para definir una función con dos casos, debe colocar ambos casos en una sola declaración let. Para hacer esto en una sola línea en el GHCi indicarle que puede separar los dos casos por ;:

Prelude> let ft 0 = 1; ft n = n * ft (n - 1) 
Prelude> ft 5 
120 
+8

En otras palabras, lo que ha escrito es (casi) correcta Haskell; el problema es que GHCI acepta una sintaxis diferente de la que pondría en un archivo fuente separado. Si pones esas dos líneas, pero sin la palabra 'let' (que es el "casi"), en un archivo Factorial.hs, a continuación, en GHCi introduzca: ': cargar Factorial' continuación 'pies 5' obtendrás 120. No sé si ya has encontrado "notación do" (por ejemplo, para E/S), pero la sintaxis permitida en el prompt GHCI es la misma que la permitida dentro de un Bloquea –