2 votes

Utilisation d'une liste d'entrées-sorties avec une liste d'entrées-sorties ?

Je récupère le contenu d'un fichier et le transforme en une liste de formulaires :

[("abc", 123), ("def", 456)]

avec readFile, lignes et mots.

Pour l'instant, je parviens à transformer la liste résultante en type IO [(String, Int)] .

Mon problème est que lorsque j'essaie de créer une fonction comme celle-ci :

check x = lookup x theMap

J'obtiens cette erreur, que je ne sais pas trop comment résoudre :

Couldn't match expected type `[(a0, b0)]'
            with actual type `IO [(String, Int)]'
In the second argument of `lookup', namely `theMap'

theMap est essentiellement ceci :

getLines :: String -> IO [String]
getLines = liftM lines . readFile

tuplify [x,y] = (x, read y :: Int)

theMap = do
    list <- getLines "./test.txt"
    let l = map tuplify (map words list)
    return l

Le contenu du fichier est le suivant :

abc 123
def 456

Quelqu'un peut-il m'expliquer ce que je fais mal ou me montrer une meilleure solution ? J'ai commencé à jouer avec les monades il y a quelques heures et je me heurte à quelques obstacles.

Remerciements

4voto

Sarah Points 3390

Vous devrez "déballer" theMap de IO. Remarquez que vous faites déjà cela pour getLines par :

do
  list <- getlines
  [...]
  return (some computation on list)

Vous auriez donc pu :

check x = do
  m <- theMap
  return . lookup x $ m

Il s'agit en fait d'un anti-modèle (bien qu'illustratif) et vous feriez mieux d'utiliser l'instance du foncteur, c'est-à-dire. check x = fmap (lookup x) theMap

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