web-dev-qa-db-fra.com

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

30
TurtleTread

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

46
sepp2k

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.

31
jozefg

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.

1
Enzhi Li