2011-04-08 73 views
11

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!

+1

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

Respuesta

29

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.

+6

Para obtener el comportamiento * exacto *, Peter describió el uso: 'flip replicate 3 3' – dbyrne

3

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:) [] 
6

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) 
2

.. o simplemente algo así

> take 3 [4,4..] 
> [4,4,4] 
Cuestiones relacionadas