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 가지리스트를주지 않습니까?
사소한 왜곡 : 왜'tempfiles = loop where loop = do ... loop'? 왜'tempfiles = do ... tempfiles'가 아닌가? –
System.Posix.Temp의 mkstemp 함수는 인수가 필요하므로 임시 파일 자체에 tempfiles가 필요하지만 재귀하고 있으므로 인수가 변경되지 않으므로 다시 전달하지 않고 방금 루프 함수를 만들었습니다 재귀는 최상위 레벨에서 전달 된 인수를 계속 재사용합니다. –
최종 결과는 다음과 같습니다. https://gist.github.com/3051620 냉정하고 솔직히 저주입니다. 무한한 게으른 임시 파일 생성기. 이 라이브러리는 재미 있습니다. –