Soy nuevo en Haskell y tengo una pregunta simple.'Repetir' en Haskell?
¿Qué función puedo usar con a y b que dará como resultado a, b veces?
Ejemplo:
a = 4 | b = 3
regresarían:
[4, 4, 4]
Gracias!
Soy nuevo en Haskell y tengo una pregunta simple.'Repetir' en Haskell?
¿Qué función puedo usar con a y b que dará como resultado a, b veces?
Ejemplo:
a = 4 | b = 3
regresarían:
[4, 4, 4]
Gracias!
replicate
:
replicate 3 4
habrá:
[4,4,4]
cuando se sabe cuál es el tipo de la función que necesita (en este caso, era bastante obvio que la función que necesitaba tenía un tipo similar a Int -> a -> [a]
) puede usar Hoogle para encontrarlo.
Para obtener el comportamiento * exacto *, Peter describió el uso: 'flip replicate 3 3' – dbyrne
Por supuesto peoro es correcto, debe usar replicate
.
Sin embargo, un patrón muy común para este tipo de tareas es la construcción de una lista infinita, y tomar todo lo que necesita de él (ya sea usando take
o takeWhile
):
rep a b = take b $ repeat a
Otro (más educativo que práctico) enfoque es usar una lista de la longitud correcta, y el mapa de todos los elementos a una:
rep a b = map (const a) [1..b]
un muy ineficiente, pero la versión interesante es
rep a b = until ((b==).length) (a:) []
También podría usar recursividad (aunque las soluciones anteriores deben ser preferidos por supuesto):
rep a 0 = []
rep a b = a : rep a (b-1)
.. o simplemente algo así
> take 3 [4,4..]
> [4,4,4]
Hoogle como siempre es su amigo: Estado la función que le gustaría encontrar: 'Integral b => a -> b -> [a]', y le dirá la respuesta: http://www.haskell.org/hoogle/?hoogle=Integral+ b +% 3D% 3E + a + -% 3E + b + -% 3E + [a] – stusmith