2016-03-23 10 views
1

Ich benutze haskell-pipes, um rekursiv ein Verzeichnis zu durchlaufen und die Dateien zu drucken. Wie gehe ich mit Ausnahmen vom Producer um, der ein Monad Transformer ist? bracket und handle funktionieren in diesem Fall nicht.Abfangen von Ausnahmen in Monadetransformatoren

import Control.Exception (handle, SomeException(..)) 
import Control.Monad (unless) 
import System.FilePath.Posix ((</>)) 
import Pipes 
import qualified Pipes.Prelude as P 
import System.Posix.Directory (DirStream, openDirStream, closeDirStream, readDirStream) 
import System.Posix.Files (getFileStatus, isDirectory) 

produceFiles :: DirStream -> Producer FilePath IO() 
produceFiles ds = do 
    path <- lift $ readDirStream ds 
    yield path 
    unless (path == "") $ produceFiles ds 

getDC :: FilePath -> Producer FilePath IO() 
getDC top = do 
    {- 
    lift $ handle (\(SomeException e) -> putStrLn (show e)) $ do 
    ds <- openDirStream top 
    -- DOESN'T WORK: produceFiles ds 
    -- I would have to "delift" the above somehow. 
    closeDirStream ds 
    -} 
    ds <- lift $ openDirStream top 
    produceFiles ds 
    lift $ closeDirStream ds 

getDC' :: FilePath -> Producer FilePath IO() 
getDC' top = getDC top >-> P.filter (`notElem` [".", ".."]) >-> P.map (top</>) 

getDCR :: FilePath -> Producer FilePath IO() 
getDCR top = for (getDC' top) $ \f -> do 
    st <- lift $ getFileStatus f 
    if isDirectory st && f /= top 
    then getDCR f 
    else yield f 

test top = runEffect $ for (getDCR top) (lift . putStrLn) 

main = test "/usr/share" 

Antwort

3

Sie können bracket, handle und andere Ausnahmebehandlung Einrichtungen von Pipes.Safe importieren.

+0

Danke! Ich habe gerade festgestellt, Pipes-Safe wurde im Abschnitt Abschluss der Rohre Tutorial erwähnt. Es ist ziemlich versteckt dort ... –