Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Shelly示例代码_Haskell_Shelly - Fatal编程技术网

Haskell Shelly示例代码

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

我正在试图弄清楚如何使用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包装的文件名运行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操作。