f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
alguien me puede explicar lo que hace. Sé que vuelve [0,1,4,9,16 ..], pero yo no entiendo cómo y qué significa n : f
¿Puede alguien explicarme la siguiente expresión de Haskell
f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
alguien me puede explicar lo que hace. Sé que vuelve [0,1,4,9,16 ..], pero yo no entiendo cómo y qué significa n : f
¿Puede alguien explicarme la siguiente expresión de Haskell
:
es el operador "contras" y construye una nueva lista cuya cabeza es el valor a la izquierda del operador y cuya cola es el valor a la derecha del operador. Por lo tanto, 0 : [1, 2, 3]
es la lista [0, 1, 2, 3]
.
comprobar el comportamiento de esta función, mediante la evaluación de f 1 0
como sigue:
f 1 0 = 0 : f 3 1
es decir f 1 0
es el resultado de la creación de una nueva lista que consiste en 0
a la cabeza y la lista devuelta por f 3 1
como su cola. Del mismo modo, f 3 1
es como sigue:
f 3 1 = 1 : f 5 4
es decir f 3 1
es el resultado de la creación de una nueva lista que consiste en 1
a la cabeza y la lista devuelta por f 5 4
como su cola.
Por lo tanto, la función crea recursivamente una lista. Además, es infinitamente recursivo de cola (ya que no tiene una condición de terminación) y dará como resultado una lista infinitamente larga.
cuanto a la línea inicial, f :: Integer -> Integer -> [Integer]
, esto indica que f
es una función que toma dos números enteros (Integer -> Integer
) y devuelve una lista de números enteros ([Integer]
). Estrictamente hablando, f
toma un número entero (Integer
) y devuelve otra función que toma un número entero y devuelve una lista de enteros (Integer -> [Integer]
) como resultado de la función de currying. Este es un concepto con el que se familiarizará cuando ingrese a Haskell y a otros lenguajes de programación funcionales con mayor profundidad.
El código en su pregunta no hace nada porque contiene un error de tipo y un error de sintaxis.
f :: Integer -> Integer --> [Integer]
Como se puede ver en la que destaca el último bit es un comentario porque --
comienza un comentario en Haskell. Como consecuencia, el tipo declarado de f
es Integer -> Integer
, lo cual es incorrecto. Para arreglar este cambio, -->
a ->
.
f i n = n : f (i+2) (n+i]
Aquí tienes una abertura (
y luego un cierre ]
. Obviamente eso está mal. Para arreglar este cambio, (n+i]
a (n+i)
.
Ahora que eso que se han hecho, esto es lo que hace el código fijo:
:
es un constructor para el tipo de lista. x : xs
es la lista que tiene x
como su cabeza y xs
como su cola. n : f (i+2) (n+i)
se analiza como n : (f (i+2) (n+i))
(no (n : f) (i+2) (n+1)
como parece creer). Por lo tanto, crea una lista cuya cabeza es n
y su cola es el resultado de f (i+2) (n+1)
.
Tiene errores de sintaxis en su ejemplo ... – sth
+1 * THIS * es cómo hacer una pregunta sobre la tarea. – luqui