55 votes

Haskell : ne peut pas utiliser "map putStrLn" ?

J'ai une liste de chaînes et j'ai essayé ceci :

ls = [ "banana", "mango", "orange" ]

main = do
       map PutStrLn list_of_strings

Cela n'a pas fonctionné, et je ne comprends pas pourquoi.

ghc print-list.hs
print-list.hs:3:0:
    Couldn't match expected type `IO t' against inferred type `[IO ()]'
    In the expression: main
    When checking the type of the function `main'

Des indices ? Je suppose que c'est lié au fait que map renvoie une liste et non une valeur, mais je n'ai pas trouvé de moyen facile de résoudre ce problème.

Pour l'instant, le seul moyen que je connaisse pour imprimer une liste de chaînes de caractères est d'écrire une fonction qui va itérer la liste, en imprimant chaque élément (print si la liste est [a], mais print et recurse si c'est (a:b)). Mais ce serait beaucoup Il est plus simple d'utiliser la carte...

Merci de votre attention !

99voto

Ayman Hourieh Points 39435

Le type de main devrait être IO t (donde t est une variable de type). Le type de map putStrLn ls es [IO ()] . C'est pourquoi vous obtenez ce message d'erreur. Vous pouvez le vérifier vous-même en exécutant la commande suivante dans ghci :

Prelude> :type map putStrLn ls
map putStrLn ls :: [IO ()]

Une solution au problème consiste à utiliser mapM qui est la version "monadique" de map . Vous pouvez également utiliser mapM_ ce qui est la même chose que mapM mais ne collecte pas les valeurs renvoyées par la fonction. Puisque vous ne vous souciez pas de la valeur de retour de la fonction putStrLn il est plus approprié d'utiliser mapM_ ici. mapM_ a le type suivant :

mapM_ :: Monad m => (a -> m b) -> [a] -> m ()

Voici comment l'utiliser :

ls = [ "banana", "mango", "orange" ]
main = mapM_ putStrLn ls

20voto

Ganesh Sittampalam Points 17695

La réponse d'Ayman est la plus logique dans cette situation. En général, si vous avez [m ()] et vous voulez m () puis utiliser sequence_m peut être n'importe quelle monade, y compris IO .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X