Question

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

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

main = do
       map PutStrLn list_of_strings

Cela ne fonctionne pas, 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'

Les conseils? Je suppose qu'il doit faire sur la carte retourner une liste et non pas une valeur, mais je n'ai pas trouvé un moyen facile de résoudre ce problème.

En ce moment, la seule façon que je connaisse pour imprimer une liste de chaînes est d'écrire une fonction qui itérer la liste, l'impression de chaque élément (imprimer si la liste est [a], mais l'impression et récursif si elle est (a: b )). Mais il serait beaucoup plus simple à utiliser qu'élaborer ...

Merci!

Était-ce utile?

La solution

Le type de la fonction de main doit être IO t (où t est une variable de type). Le type de map putStrLn ls est [IO ()]. Ce pourquoi vous obtenez ce message d'erreur. Vous pouvez 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 utilise mapM , qui est la version "unaire" de map. Ou vous pouvez utiliser mapM_ qui est la même chose que mapM mais ne recueille pas les valeurs renvoyées par la fonction. Puisque vous ne se soucient pas de la valeur de retour de 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

Autres conseils

La réponse de Ayman est plus logique de cette situation. En général, si vous avez [m ()] et que vous voulez m (), puis utilisez sequence_, où m peut être une monade, y compris IO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top