Перечислители Haskell, странные ошибки - PullRequest
2 голосов
/ 14 февраля 2011

Я пытаюсь выяснить, как работают счетчики, и поэтому тестирую библиотеку перечислителей. У меня есть фрагмент, который компилируется на моем настольном компьютере, но жалуется на No instance for MonadIO. Я не знаю, как использовать библиотеку перечислителей или что-то не так с моим ноутбуком?

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)

и код

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))

1 Ответ

2 голосов
/ 14 февраля 2011

Попробуйте изменить импорт:

import Control.Monad.Trans

на

import Control.Monad.IO.Class

Возможно, у вас установлена ​​более старая версия mtl и, следовательно, у вас разные классы типов MonadIO между Control.Monad.Trans и Data.Enumerator.

...