【发布时间】:2013-08-12 13:13:51
【问题描述】:
我正在尝试弄清楚如何使用 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的帮助下 我终于让代码工作了。 我将下面的代码发布给可能使用它的人。 注意使用unpack。
{-# 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
【问题讨论】:
-
我知道我是一个初学者,但是为了了解如何使用这个简单的功能而不得不深入研究源代码真的很令人沮丧。我希望人们在编写库时可以多写几个例子。 Haskell 本身已经因困难而声名狼藉(尽管所有 haskell 都声称这很容易)
-
你看过这个教程吗? linux-magazin.de/Online-Artikel/… 它在雪莉的自述文件中链接。
-
@MikeHartl 我做到了。它没有多大帮助,坦率地说,我认为这是一个笑话,教人们如何在没有 Monad 知识的情况下用 Haskell 编写脚本