2013-08-12 3 views
1

Я пытаюсь выяснить, как использовать библиотеку Shelly (Shell.Pipe). До сих пор я получил:Haskell Shelly пример кода

{-# 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? Например, я хочу запустить команду ebook-convert для этих имен файлов, завернутых Sh Monad.

Btw: Примеры действительно скудны в Интернете ... И очень сбивает с толку, что есть две похожие лимии: Shelly и Shelly.Pipe. Функции внутри этих двух акций тем же именем с разными типами: В Shelly.Pipe:

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

В Shelly:

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 
+0

Я знаю, что я новичок, но мне действительно сложно разобраться в исходном коде, чтобы узнать, как использовать эту простую функцию. Я хочу, чтобы люди могли написать еще несколько примеров, когда они пишут libries. Сам Haskell уже получил плохую репутацию за то, что он был трудным (хотя ALL haskellers утверждают, что это легко) – osager

+1

Вы видите этот урок? http://www.linux-magazin.de/Online-Artikel/Shell-scripting-with-type-safety-using-Haskell/ Он был связан с файлом readme Shelly. – firefrorefiddle

+0

@MikeHartl сделал. Это не очень помогает, и, честно говоря, я думаю, что это шутка, которая учит людей писать сценарий в Haskell без предварительного знания Monad. – osager

ответ

2

Из того, что я могу собрать, вы не хотите использовать модуль Shelly.Pipe, только Shelly модуль. Монашка ShIO реализует MonadIO, что позволяет выполнять произвольные действия ввода-вывода, находясь внутри ShIO. Это позволит вам сделать что-то вроде

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 
+1

Спасибо, что это помогает. Я как-то понял, что Shelly.Pipe - улучшенная версия над Shelly. – osager

+1

Когда я посмотрел документацию по Hackage, был только модуль «Shelly» как «public». На первый взгляд мне кажется, что «Shelly.Pipe» - это куча внутренних функций, а «Shelly» - это публичный интерфейс, который использует эти функции. Вероятнее всего, вам будет гораздо полезнее использовать монадию 'ShIO', поскольку она позволяет вам делать любые типы ввода-вывода, такие как конвертирование файлов и т. Д. – bheklilr

+1

@osager На самом деле это выглядит так, как будто я ошибался. По какой-то причине Google не раскрыл последнюю версию библиотеки Shelly по хаке, поэтому я смотрел довольно старую версию. В документации говорится, что использование монадии 'Sh' и тип' SHIO' устарели. Монаша 'Sh' по-прежнему остается« MonadIO », поэтому вы можете сделать IO в ней с помощью' liftIO'. В документации по-прежнему рекомендуется использовать модуль 'Shelly' вместо' Shelly.Pipes'. – bheklilr

Смежные вопросы