Haskell Shelly示例代码

时间:2013-08-12 13:13:51

标签: haskell shelly

我正在试图弄清楚如何使用Shelly(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文件进行操作? 例如,我想对Sh Monad包装的那些文件名运行ebook-convert命令。

顺便说一句:互联网上的例子非常稀少...... 有两个相似的图书是非常令人困惑的:Shelly和Shelly.Pipe。这两个函数共享相同的名称和不同的类型: 在Shelly.Pipe:

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

在雪莉:

find :: FilePath -> ShIO [FilePath]

真的很沮丧!

PS:在John Wiegley的帮助下 我终于让代码工作了。 我将以下代码发布给可能使用它的人。 注意解压缩的使用。

{-# 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 个答案:

答案 0 :(得分:2)

根据我的收集,您不想使用Shelly.Pipe模块,只需Shelly模块。 ShIO monad实现MonadIO,允许您在ShIO内执行任意IO操作。这可以让你做类似

的事情
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