¿Por qué esta función no termina en Haskell?

8

Estoy confundido por qué mi función nestque se compone fconsigo misma nveces

nest f 0 = id
nest f n = f . nest f (n - 1)

nunca termina Pensé que "coincidiría con el patrón" en el caso cuando se nconvierta en cero. Lo estoy definiendo escribiendo estas dos líneas en GHCI y llamando nest (+ 1) 2 3por ejemplo.

Jon Deaton
fuente
44
Necesitamos más. ¿Cómo estás definiendo y cargando esta función? ¿Cómo llamas a esta función? Cuando lo guarde como un archivo, cárguelo con GHCi 8.6.4 y llámelo cuando nest (+1) 3 2termine con 5.
Thomas M. DuBuisson
1
Oh, interesante. Estaba pegando en GHCI y llamándolo como tú nest (+1) 3 2.
Jon Deaton

Respuestas:

12

Al escribir la función en dos líneas REPL separadas, esencialmente la está redefiniendo la segunda vez, omitiendo el caso base.

La forma correcta de ingresar esta función en REPL es:

nest f 0 = id; nest f n = f . nest f (n - 1)

Alternativamente, puede ingresar al modo multilínea con el :{comando y dejarlo usando :}.

Emily
fuente
6

Cuando lo pegó en GHCi, lo que hizo fue definir una función nest f 0 = id. Luego dijiste "ignora esa función, la estoy reemplazando con una nueva función del mismo nombre donde está toda la definición nest f n = f . nest f (n - 1).

Thomas M. DuBuisson
fuente