【问题标题】:Haskell Shelly sample codeHaskell Shelly 示例代码
【发布时间】: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 编写脚本

标签: haskell shelly


【解决方案1】:

据我所知,您不想使用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

【讨论】:

  • 感谢您的帮助。我不知何故想到 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
  • 感谢您抽出宝贵时间对此进行验证。我仍在努力进出这两个 Monad
  • 哦,对不起,我没有运行这段代码(很明显,因为 convertEpub 是未定义的),所以我对出现问题并不感到惊讶。我更希望说明如何获取文件名以及如何在 ShShIO monads 中执行 IO 操作。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2011-04-23
  • 2011-12-17
  • 2016-12-01
  • 1970-01-01
相关资源
最近更新 更多