2017-07-13 2 views
0

Um ein wenig über Turtle zu lernen, dachte ich, es wäre nett, Beispiel aus dem Tutorial zu ändern. Ich entschied mich, den reduktiven "FilePath" aus jeder Zeile der Ausgabe zu entfernen, da ich dachte, es wäre eine einfache Übung.Wie können Pfade mit der Haskell Turtle-Bibliothek gedruckt werden?

Und trotzdem, trotz der Bemühungen des Autors, seine Bibliothek einfach zu benutzen, habe ich es fast nicht benutzt, um dieses einfache Problem zu lösen.

habe ich versucht, every ich sah, dass sah aus wie es mir irgendwie >>= von IO in Shell erlauben würde, heben: MonadIO, FoldM, liftIO, _foldIO ohne Erfolg. Ich wurde frustriert und nur durch das Lesen von Turtle Quellcode konnte ich etwas finden, das zu funktionieren scheint ("keine offensichtlichen Mängel" in den Sinn kommen).

Warum ist das so schwer? Wie kommt man logischerweise mit der API dieser Bibliothek zu einer Lösung?

#!/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) 

Antwort

3

Sie heben nicht >>= von IO in Shell. Shell hat bereits eine Monad Instanz, die mit ihrer eigenen >>= Funktion kommt. Stattdessen heben Sie entweder IO Aktionen in Shell mit liftIO oder führen Sie die Shell mit fold oder foldM. Verwenden Sie sh, um das Shell auszuführen, wenn Sie sich nicht für die Ergebnisse interessieren.

Ich glaube, Ihr Beispiel zu

vereinfacht werden kann
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 

Was die Schwierigkeit, eine Zeichenfolge zurück von einem FilePath mit bekommen, ich glaube nicht, dass auf dem Schildkröte Autor verantwortlich gemacht werden. Ich denke, es kann

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 

Kombiniert

vereinfacht werden dies das Beispiel

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

oder

main = view $ do 
    homedir <- home 
    filepath <- lstree $ homedir </> "projects" 
    return $ stringPath filepath 
vereinfachen würde
Verwandte Themen