Haskell Shelly示例代码
我正在试图弄清楚如何使用Shelly(Shell.Pipe)库。 到目前为止,我已经:Haskell Shelly示例代码,haskell,shelly,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.La
{-# 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包装的文件名运行ebookconvert命令
顺便说一句:这些例子在互联网上真的很少见。。。
令人困惑的是,有两个相似的图书馆:Shelly和Shelly.Pipe。这两个函数中的函数具有相同的名称和不同的类型:
在Shelly.Pipe中:
find :: FilePath -> Sh FilePath
find = sh1s S.find
在雪莱:
find :: FilePath -> ShIO [FilePath]
真令人沮丧
附:在你的帮助下
我终于让代码工作了。
我在下面为可能使用它的人发布代码。
注意开箱使用
{-# 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
{-#语言重载字符串}
{-#语言扩展DefaultRules}
{-#选项_GHC-fno警告类型默认值#-}
导入控制
导入数据列表(排序)
进口管制
进口雪莉
导入系统目录
导入数据.Text
导入System.FilePath
默认值(文本)
bookPath=“/dir/to/books”
main=shelly$verbosely$do
fnames liftIO$putStrLn$ProcessBookFileName$unpack$toTextIgnore n--ProcessBookFileName::String->String
据我所知,您不想使用Shelly.Pipe
模块,只想使用Shelly
模块。ShIO
monad实现了MonadIO
,允许您在ShIO
内部执行任意IO操作。这会让你做一些类似的事情
convertEpub::FilePath->IO()
convertEpub fname=未定义
main=shelly$do
cd“项目/haskell/测试”
liftIO$putStrLn“你好,世界!我在Shelly”
fnames做什么
putStrLn$“处理文件”++显示fname
convertEpub fname
我知道我是一个初学者,但要想知道如何使用这个简单的函数,就必须深入研究源代码,这真是令人沮丧。我希望人们在写图书馆时能多写几个例子。Haskell本身已经因为难学而声名狼籍(尽管所有Haskell人都声称它很容易),你看过本教程吗?它链接到Shelly的自述文件中。@MikeHartl我链接到了。这没有多大帮助,坦率地说,我认为这是一个笑话,教人们如何在没有MonadThank知识的情况下用Haskell编写脚本。谢谢,这很有帮助。我不知怎的想到了Shelly.Pipe是一个比Shelly更好的版本。当我查看有关Hackage的文档时,只有Shelly
模块是“public”。乍一看,Shelly.Pipe是一组内部函数,Shelly
是使用这些函数的公共接口。使用ShIO
monad可能会对您更有用,因为它允许您仍然执行任何您喜欢的IO操作,例如转换文件等。@osager看起来我错了。不管出于什么原因,谷歌没有在hackage上发布最新版本的Shelly库,所以我在看一个非常旧的版本。文档中说要使用Sh
monad,而ShIO
类型正被弃用。Sh
monad仍然是一个MonadIO
,因此您可以使用liftIO
在其中执行IO。文档仍然建议使用Shelly
模块,而不是Shelly.Pipes
。感谢您花时间验证这一点。我仍然在这两个MonadsOh中挣扎,抱歉,我没有运行这段代码(显然,因为convertEpub是未定义的),所以出现问题并不奇怪。我更希望说明如何获取文件名以及如何在Sh
或ShIO
单子中执行IO操作。