loops haskell io

loops - bucle Haskell simple



io (3)

Acabo de empezar a aprender Haskell, pero la ausencia de bucles es infinitamente frustrante en este momento. Descubrí cómo escribir bucles para funciones. Mi problema, sin embargo, es que quiero mostrar algunos resultados mientras itero el ciclo. Parece que tengo que usar la depuración para realizar esta simple tarea.

Así que ahora mismo apreciaría un ejemplo de cómo imprimir una cadena 10 veces en la estructura principal.

En otras palabras, quiero hacer esto 10 veces:

main = do putStrLn "a string"

Gracias. Siento que esto será muy esclarecedor para mi tarea.


El IO de Well Haskell es un poco complicado cuando estás empezando, ya que está basado en mónadas.

Tu problema tiene una solución simple:

main = replicateM_ 10 $ putStrLn "a string"

Esto está usando el combinador replicateM_ de Control.Monad

Tiene muchas funciones útiles para componer y ejecutar acciones monádicas.


Podría definir una función recursiva que imprime "una cadena" n veces (n es el parámetro de la función), como esta:

printStringNTimes 0 = return () printStringNTimes n = do putStrLn "a string" printStringNTimes (n-1) main = printStringNTimes 10

Un enfoque algo más general sería definir una función que repite cualquier acción IO n veces:

repeatNTimes 0 _ = return () repeatNTimes n action = do action repeatNTimes (n-1) action main = repeatNTimes 10 (putStrLn "a string")

La función anterior ya existe en Control.Monad bajo el nombre replicateM_ .


También soy un principiante de Haskell, y tengo una solución que es menos elegante y, sin embargo, es pragmáticamente útil.

main = do putStr result where string = "a string" result = concat [string ++ "/n" | i <- [1,2..10]]

Así que aquí, hemos definido una lista, cuyos elementos son las cadenas que desea imprimir seguidas de un nuevo carácter de línea.