2012-07-04 6 views
4

도관에서 핸들을 얻으려고 결심했습니다. 나는 잘하고 있다고 생각했지만,이 간단한 소스를 도관 4로 만들려고 할 때 무한 루프가 발생했습니다. 이유를 이해하지 못한다. 이것은 단순화되었으며, 원래 버전은 임시 파일 이름을 생성하고 yield를 통해 반환합니다. 이것은 a()를 반환합니다.도관이있는 소스의 무한 루프

import Control.Monad.IO.Class 

import Data.Conduit 
import Data.Conduit.List as CL 

tempfiles :: MonadIO m => Source m() 
tempfiles = loop 
    where 
    loop = do 
     x <- liftIO $ print "tempfile" 
     yield x 
     loop 

나는 실행하는 경우 :

runResourceT $ (tempfiles $$ CL.take 5) 

내가 무한 루프를 얻을. 왜 그냥 5 번 실행하지 않고 나에게 5 가지리스트를주지 않습니까?

+0

사소한 왜곡 : 왜'tempfiles = loop where loop = do ... loop'? 왜'tempfiles = do ... tempfiles'가 아닌가? –

+0

System.Posix.Temp의 mkstemp 함수는 인수가 필요하므로 임시 파일 자체에 tempfiles가 필요하지만 재귀하고 있으므로 인수가 변경되지 않으므로 다시 전달하지 않고 방금 루프 함수를 만들었습니다 재귀는 최상위 레벨에서 전달 된 인수를 계속 재사용합니다. –

+0

최종 결과는 다음과 같습니다. https://gist.github.com/3051620 냉정하고 솔직히 저주입니다. 무한한 게으른 임시 파일 생성기. 이 라이브러리는 재미 있습니다. –

답변

4

도관 0.4에서 수율은 자동 종료를 수행하지 않습니다. 이것은 0.5 릴리스의 중요한 변경 사항입니다. 코드가 예상대로 작동합니다.

+0

글쎄, 나는 http-conduit를 기다리고 있었지만 지금은 업데이트 할 충분한 이유가 있다고 생각한다. 감사. –