![](/img/trans.png)
[英]how to drop lines when streaming from a file using Haskell and the turtle library
[英]How to print paths using Haskell Turtle library?
为了学习有关Turtle
,我认为最好修改本教程中的示例。 我选择从输出的每一行中删除多余的“ FilePath”,因为这将是一个简单的练习。
然而,尽管作者努力使他的库易于使用,但我几乎没能使用它来解决这个简单的问题。
我尝试过每样东西,似乎让我以某种方式将>>=
从IO
提升到Shell
: MonadIO
, FoldM
, liftIO
, _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)
您不会将>>=
从IO
提升到Shell
。 Shell
已经有一个Monad
实例,它带有自己的>>=
函数。 相反,您可以使用liftIO
将IO
操作提升到Shell
,或者使用fold
或foldM
运行Shell。 当您不关心结果时,请使用sh
运行Shell
。
我相信您的例子可以简化为
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
至于从FilePath
取回字符串的困难,我认为这不能归咎于Turtle作者。 我认为可以简化为
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
结合这将简化示例
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.