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.

26
demandé sur jberryman 2013-04-15 01:11:02

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_.

41
répondu sepp2k 2013-04-14 21:14:46

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.

28
répondu jozefg 2013-04-17 00:26:20

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.

1
répondu Enzhi Li 2016-10-10 15:24:32