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 le débogage pour effectuer cette tâche simple.
Donc, pour l'instant, j'apprécierais simplement un exemple de la façon d'imprimer une chaîne 10 fois dans la structure principale.
En d'autres termes, je veux le faire 10 fois:
main = do
putStrLn "a string"
Merci. Je pense que ce sera très éclairant pour ma tâche.
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 serait de définir une fonction qui répète toutes les actions 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 replicateM_
.
Eh bien, Haskell IO est un peu délicat lorsque vous débutez car il est basé sur des monades.
Votre problème a cependant une solution simple:
main = replicateM_ 10 $ putStrLn "a string"
Ceci utilise le combinateur replicateM_
de 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 moins élégante et pourtant pragmatique.
main = do
putStr result
where
string = "a string"
result = concat [string ++ "\n" | i <- [1,2..10]]
Nous avons donc ici défini une liste dont les éléments sont les chaînes que vous souhaitez imprimer suivies d'un nouveau caractère de ligne.