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"
Danke! Ich habe gerade festgestellt, Pipes-Safe wurde im Abschnitt Abschluss der Rohre Tutorial erwähnt. Es ist ziemlich versteckt dort ... –