繁体   English   中英

如何使用Haskell Turtle库打印路径?

[英]How to print paths using Haskell Turtle library?

为了学习有关Turtle ,我认为最好修改本教程中的示例。 我选择从输出的每一行中删除多余的“ FilePath”,因为这将是一个简单的练习。

然而,尽管作者努力使他的库易于使用,但我几乎没能使用它来解决这个简单的问题。

我尝试过每样东西,似乎让我以某种方式将>>=IO提升到ShellMonadIOFoldMliftIO_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实例,它带有自己的>>=函数。 相反,您可以使用liftIOIO操作提升到Shell ,或者使用foldfoldM运行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM