Question

J'essaie de comprendre comment fonctionnent les enquêteurs et donc de tester la bibliothèque des enquêteurs.J'ai un extrait qui se compile sur mon ordinateur de bureau, mais se plaint No instance for MonadIO.Suis-je loin de savoir comment utiliser la bibliothèque de l'enquêteur ou quelque chose ne va pas avec mon ordinateur portable ?

iterateetests.hs:29:17:
    No instance for (MonadIO (Iteratee Int IO))
      arising from a use of `enumeratorFile' at iterateetests.hs:29:17-32
    Possible fix:
      add an instance declaration for (MonadIO (Iteratee Int IO))
    In the first argument of `(==<<)', namely `enumeratorFile h'
    In the first argument of `run_', namely
        `(enumeratorFile h ==<< summer)'
    In the expression: run_ (enumeratorFile h ==<< summer)

Et le code

import Data.Enumerator
import qualified Data.Enumerator.List as EL
import System.IO
import Control.Exception.Base
import Control.Monad.Trans

summer :: (Monad m) => Iteratee Int m Int
summer = do
  m <- EL.head
  case m of
       Nothing -> return 0
       Just i -> do
     rest <- summer
     return (i+rest)

enumeratorFile h (Continue k) = do
  e <- liftIO (hIsEOF h)
  if e
     then k EOF
     else do
       l <- liftIO $ hGetLine h
       k (Chunks [read l]) >>== enumeratorFile h
enumeratorFile _ step = returnI  step

main = do
  bracket
    (openFile "numberlist" ReadMode)
    (hClose)
    (\h -> run_ (enumeratorFile h ==<< summer))
Était-ce utile?

La solution

Essayez de modifier l'importation de :

import Control.Monad.Trans

à

import Control.Monad.IO.Class

Il se peut que vous ayez une ancienne version de mtl installée et que vous ayez donc des classes de types MonadIO différentes entre Control.Monad.Trans et Data.Enumerator.

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