J'essaie de lire un fichier dans une fonction pour calculer les fréquences de caractères dans un fichier. Donc, je suis en train de ce qui suit:Haskell readFile: Impossible de faire correspondre le type attendu '[String]' avec le type réel 'IO String'
charCount :: String -> [(Char, Int)]
charCount input = M.toList $ M.fromListWith (+) [(c, 1) | c <- input]
calculate :: FilePath -> [(Char, Int)]
calculate fp = do
c <- readFile fp
charCount c
Mais je reçois l'erreur suivante:
FileWriter.hs:13:8: Couldn't match expected type ‘[String]’ …
with actual type ‘IO String’
In a stmt of a 'do' block: c <- readFile fp
In the expression:
do { c <- readFile fp;
charCount c }
Compilation failed.
C'est un défaut du message d'erreur GHC. Le vrai problème est le suivant: 'calculate' ne peut pas renvoyer juste un type de liste (spécifiquement' [(Char, Int)] '). Vous lisez un fichier, ce qui signifie que vous avez "infecté" la fonction avec IO. La façon dont je pense à ce sujet est que toute fonction qui appelle une fonction IO devient alors une autre fonction IO. Essayez plutôt 'IO [(Char, Int)]' pour le type de retour. – hao
Si je change le type de retour il est dit 'Impossible de correspondre au type attendu 'IO [(Char, Int)]' avec le type réel '[(Char, Int)]'' – astiefel
Nous avons maintenant passé à des échecs de Haskell courbe d'apprentissage. Un indice: il existe une fonction avec le type 'a -> IO a', mais elle est déguisée en' (Monad m) => a -> m a'. – hao