Пример кода на Хаскелле Шелли

Я пытаюсь понять, как использовать библиотеку Шелли (Shell.Pipe). Пока у меня есть:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
import Control.Applicative
import Data.List(sort)

import Shelly.Pipe
import Data.Text.Lazy as LT

default (LT.Text)

findExt ext = findWhen (pure . hasExt ext)
main = shelly $ verbosely $ do
cd bookPath 
findExt "epub" "."

Я могу найти все файлы epub, но тогда я понятия не имею, как работать с каждым файлом epub? Например, я хочу запустить команду ebook-convert для тех имен файлов, которые заключены в Sh Monad.

Кстати: примеров в интернете очень мало... И очень запутанно, что есть две подобные библиотеки: Шелли и Шелли. Пайп. Функции внутри этих двух имен имеют одинаковые имена с разными типами: в Shelly.Pipe:

find :: FilePath -> Sh FilePath
find = sh1s S.find

В Шелли:

find :: FilePath -> ShIO [FilePath]

Действительно расстраивает!

PS: с помощью Джона Вигли я наконец-то получил работающий код. Я публикую код ниже для людей, которые могут его использовать. Обратите внимание на использование распаковки.

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
{-# OPTIONS_GHC -fno-warn-type-defaults #-}

import Control.Applicative
import Data.List(sort)
import Control.Monad
import Shelly
import System.Directory
import Data.Text
import System.FilePath
default (Text)


bookPath = "/dir/to/books"

main = shelly $ verbosely $ do
    fnames <- Shelly.find bookPath  --fnames can not be processed by normal pure String processing functions and need to be "escaped"
    forM_ fnames $ \n-> liftIO $ putStrLn $ ProcessBookFileName $ unpack $ toTextIgnore n --ProcessBookFileName::String->String

1 ответ

Из того, что я могу собрать, вы не хотите использовать Shelly.Pipe модуль, просто Shelly модуль. ShIO монада реализует MonadIO, что позволяет выполнять произвольные действия ввода-вывода, находясь внутри ShIO, Это позволит вам сделать что-то вроде

convertEpub :: FilePath -> IO ()
convertEpub fname = undefined

main = shelly $ do
    cd "projects/haskell/testing"
    liftIO $ putStrLn "Hello, world!  I'm in Shelly"
    fnames <- find (pure . hasExt "hs") "."
    liftIO $ forM_ fnames $ \fname -> do
        putStrLn $ "Processing file " ++ show fname
        convertEpub fname
Другие вопросы по тегам