2017-07-13 11 views
0

Turtleについて少し学ぶには、チュートリアルの例を修正するのがいいと思った。私は、出力の各行から、簡単な運動であると考えて、冗長な "FilePath"を削除することを選択しました。Haskell Turtleライブラリを使用してパスを印刷する方法は?

しかし、図書館を使いやすくするための作者の努力にもかかわらず、私はこの単純な問題を解決するのにほとんど役に立たなかった。

私はそれは私が何とかShellIOから>>=を持ち上げることが可能になるように見えた私はそれを見たeverytingを試してみました:MonadIOFoldMliftIO、ない成功を収めた_foldIO。私は不満を募らせて、読んでTurtleのソースコードを読んだだけで、うまくいくようなことを見つけることができました(「明白な欠陥はありません」)。

これはなぜ難しいですか?どのようにして、このライブラリのAPIを使って論理的に解決策を得ることができますか?

#!/usr/bin/env stack 
-- stack --resolver lts-8.17 --install-ghc runghc --package turtle --package lens 
{-# LANGUAGE OverloadedStrings #-} 
import Turtle 
import Control.Lens 
import Control.Foldl as Foldl 
import Filesystem.Path.CurrentOS 
import Data.Text.IO as T 
import Data.Text as T 

main = do 
    homedir <- home 
    let paths = lstree $ homedir </> "projects" 
    let t = fmap (Control.Lens.view _Right . toText) paths 
    customView t 

customView s = sh (do 
    x <- s 
    liftIO $ T.putStrLn x) 

答えて

3

あなたはShellIOから>>=を持ち上げないでください。 Shellには、すでに関数が付属しているMonadインスタンスがあります。代わりにIOアクションをShellliftIOで持ち込むか、foldまたはfoldMでシェルを実行してください。結果を気にしない場合はshを使用してShellを実行してください。私はあなたの例では、バックFilePathから文字列を取得するとの難しさについては

main = sh $ do 
    homedir <- home 
    filepath <- lstree $ homedir </> "projects" 
    case (toText filepath) of 
    Right path -> liftIO $ T.putStrLn x 
    Left approx -> return() -- This shouldn't happen 

に単純化することができると信じて

は、私はカメの作者のせいにすることができないと思います。私は、それが、これは

main = sh $ do 
    homedir <- home 
    filepath <- lstree $ homedir </> "projects" 
    liftIO $ putStrLn (stringPath filepath) 

または

main = view $ do 
    homedir <- home 
    filepath <- lstree $ homedir </> "projects" 
    return $ stringPath filepath 
に例を単純化する組み合わせ

stringPath :: FilePath -> String 
stringPath filepath = 
    case (toText filePath) of    -- try to use the human readable version 
    Right path -> T.unpack path 
    Left _  -> encodeString filePath -- fall back on the machine readable one 

に単純化することができると思います

関連する問題