2012-07-12 2 views
1

하스켈에서 iteratee I/O가 무엇인지 알아 내려고합니다. 나는 약간의 definitions와 함께 다음 Haskell-Wiki를 점검했다.하스켈에서 iteratee 함수 이해하기

내가 그 함수의 두 번째, 세 번째와 마지막 두 줄의 의미를 이해하지 못한다는 :

enumerator :: FilePath -> Iteratee (Maybe Char) o -> IO o 
enumerator file it = withFile file ReadMode 
    $ \h -> fix (\rc it -> case it of 
    Done o -> return o 
    Next f -> do 
     eof <- hIsEOF h 
     case eof of 
     False -> do 
      c <- hGetChar h 
      rc (f (Just c)) 
     True -> rc (f Nothing) 
    ) it 

내가 알고는 iteratee 기능이 무엇을,하지만 난 몇 줄을 이해하지 않습니다. 이 위키피지의 다른 기능은 정말 신비합니다. 나는 그들이 무엇을하는지 이해하지 못한다. 왜냐하면 나는 약간의 설명을 놓친다.

답변

4

언급 한 행은 열거 자/iteratee와 관련이 없지만 설명 할 수는 있습니다.


말하면
withFile name mode = bracket (openFile name mode) (closeFile) 

, withFile는 파일을 여는 주어진 콜백 핸들을 통과하고, 콜백이 완료된 후 파일이 폐쇄되는 것을 보장한다.


fix은 고정 소수점 결합 자입니다. 예 :

fix (1 :) == 1 : 1 : 1 : 1 : ... 

일반적으로 자체 재귀 함수를 작성하는 데 사용됩니다. TFAE는 :

factorial 0 = 1 
factorial n = n * factorial (n-1) 

factorial n = fix (\f n -> case n of 0 -> 1; n -> n * f (n-1)) n 

우리는이 구조없이 동일한 기능을 다시 작성할 수 있습니다 :

enumerator :: FilePath -> Iteratee (Maybe Char) o -> IO o 
enumerator file it = do 
    h <- openFile file ReadMode 
    let rc (Done o) = return o 
     rc (Next f) = do 
     eof <- hIsEof h 
     case eof of 
      False -> do 
      c <- hGetChar h 
      rc (f (Just c)) 
      True -> rc (f Nothing) 
    o <- rc it 
    closeFile h 
    return o 

withFile 예외를 처리하고이하지 않는로 완전히 정확하지 비록.

도움이 되었습니까?

2

아마도 람다 함수의 이름이 지정되면 도움이 될 것입니다. iteratee이 중단 때까지

enumerator :: FilePath -> Iteratee (Maybe Char) o -> IO o 
enumerator file it = withFile file ReadMode $ stepIteratee it 
    where 
    stepIteratee (Done o) _h = return o 
    stepIteratee (Next f) h = do 
     eof <- hIsEOF h 
     case eof of 
     False -> do 
      c <- hGetChar h 
      stepIteratee (f (Just c)) h 
     True -> stepIteratee (f Nothing) h 

stepIteratee는 파일과 iteratee 모두를 단계별로 유지합니다.

관련 문제