2011-02-14 7 views
2

열거 자의 작동 방식을 파악하고 열거 자 라이브러리를 테스트하려고합니다. 내 데스크톱 컴퓨터에서 컴파일하는 스 니펫을 가지고 있지만 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)) 

답변

2

이의 수입을 변경해보십시오 코드 :

import Control.Monad.Trans 

그것은 당신이 MTL의 이전 버전이 설치되어 있는지 될 수있다

import Control.Monad.IO.Class 

에 , 따라서 다른 MonadIO typec을가집니다. Control.Monad.Trans와 Data.Enumerator 사이에 있습니다.

+0

+1하지만,'import Control.Monad.IO.Class'를 의미합니다. – antonakos

+0

물론 그렇습니다. –

+0

감사합니다. – Masse