как вставить операцию ввода-вывода в трубу - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть функция Haskell, которая предоставляет каталог, из которого можно рекурсивно получать все файлы, и записывает имена файлов в файл. Это простой пример для начала. На следующем шаге я должен заменить отображение из файла в текст (операция transf) операцией с использованием содержимого файла; это, очевидно, операция в монаде IO.

Мое понимание Pipe очень ограничено; Я попытался с простой операцией c opex, которую я попытался lift в трубу. Я хочу удалить текущий transf

Это выглядит как простая проблема, но, несмотря на поиск в Интернете, я не могу найти решение. Спасибо за помощь!

pipedDoIO2 :: Path Abs File -> Path Abs Dir -> (Path Abs File -> IO Text) -> ErrIO ()
pipedDoIO2 file path transf =  do
    hand <-   openFile2handle file WriteMode
    Pipe.runEffect $
                getRecursiveContents path
                >-> PipePrelude.map ( transf)  -- some IO type left?
                -- >-> lift opex 
                >-> PipePrelude.toHandle hand    
    closeFile2 hand
    return ()

opex :: (Path Abs File -> IO Text)
opex = return . showT 

1 Ответ

0 голосов
/ 01 мая 2020

Еще немного чтения привело меня к простому ответу: используйте mapM из Path.Prelude. Я надеюсь, что это решение поможет другим найти это «очевидное» решение, которое нелегко обнаружить в Интернете; Я добавил filter к расширению файла в качестве примера того, как использовать filter.

Предупреждение: toHandle «Запись строк в дескриптор с использованием hPutStrLn», т.е. он вставляет \n после каждая вставка.

-- a convenient function to go through a directory and 
-- recursively apply a function to each file or directory
-- filters for extension md
pipedDoIO2 :: Path Abs File -> Path Abs Dir -> (Path Abs File -> ErrIO String) -> ErrIO ()
pipedDoIO2 file path opex =  do
    hand <-   openFile2handle file WriteMode
    Pipe.runEffect $
                getRecursiveContents path
                >-> PipePrelude.filter (hasExtension (Extension "md"))
                >-> PipePrelude.mapM opex 
                >-> PipePrelude.toHandle hand    
    closeFile2 hand
    return ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...