boucle Haskell simple
je viens de commencer à apprendre Haskell, mais l'absence de boucles est infiniment frustrante en ce moment. J'ai compris comment écrire des boucles pour les fonctions. Mon problème, cependant, est que je veux produire des résultats tout en itérant la boucle. Il semble que je doive utiliser debug pour effectuer cette tâche simple.
donc pour le moment, j'apprécierais juste un exemple de comment imprimer une chaîne 10 fois dans la structure principale.
En d'autres termes, je veux faire ce 10 fois:
main = do
putStrLn "a string"
Merci. Je pense que ce sera très éclairant pour ma tâche.
3 réponses
Vous pouvez définir une fonction récursive qui imprime "une chaîne" n fois (n étant le paramètre de la fonction), comme ceci:
printStringNTimes 0 = return ()
printStringNTimes n =
do
putStrLn "a string"
printStringNTimes (n-1)
main = printStringNTimes 10
une approche un peu plus générale consisterait à définir une fonction qui répète n'importe quelle action IO N fois:
repeatNTimes 0 _ = return ()
repeatNTimes n action =
do
action
repeatNTimes (n-1) action
main = repeatNTimes 10 (putStrLn "a string")
La fonction ci-dessus existe déjà dans Control.Monad
sous le nom de replicateM_
.
Eh bien L'IO de Haskell est un peu délicat quand vous êtes à peine débutant car il est basé sur des monades.
Votre problème a une solution simple:
main = replicateM_ 10 $ putStrLn "a string"
ceci utilise le combinateur replicateM_
Control.Monad
il a beaucoup de fonctions utiles pour composer et exécuter des actions monadiques.
je suis également un débutant de Haskell, et j'ai une solution qui est moins élégante et pourtant est pragmatiquement utile.
main = do
putStr result
where
string = "a string"
result = concat [string ++ "\n" | i <- [1,2..10]]
Donc ici, nous avons défini une liste, dont les éléments sont les chaînes que vous souhaitez imprimer, suivi par un caractère de nouvelle ligne.