使用 Haskell Turtle 的 FilePath 和 readFile

Using Haskell Turtle's FilePath with readFile

我正在尝试使用 Haskell Turtle 进行一些 CSV 文件处理,但我在使用选项解析器中的 Turtle.FilePath 时遇到了问题。 这是一个例子:

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Lib

import Control.Applicative
import qualified Data.ByteString.Lazy as BL
import Turtle

data Args = Args Turtle.FilePath
  deriving Show

tfpToStr :: Turtle.FilePath -> String
tfpToStr fpath = show fpath

tfpToPfp :: Turtle.FilePath -> Prelude.FilePath
tfpToPfp fpath = show fpath

parser :: Parser Args
parser = Args <$> (argPath "fname" "The file containing the data")

sname :: String
sname = "salaries.csv"

main :: IO ()
main = do
    Args fname <- options "Salary Printer" parser
    csvData <- BL.readFile (tfpToStr fname)
    -- csvData <- BL.readFile sname
    putStrLn $ show csvData

我在同一目录中有一个文件 salaries.csv。如果我 运行 这个,我会回来 FilePath "salaries.csv": openBinaryFile: does not exist (No such file or directory)。使用 tfpToPfp 会产生相同的结果。如果我注释掉第一个 readFile 并取消注释另一个调用 BL.readFile sname 的注释,那么它就可以完美运行。我也试过 csvData <- BL.readFile $ fromString (tfpToStr fname),这也会引发错误。

不幸的是,BL.readFile 没有直接取一个 Turtle.FilePath;它抱怨它没有得到 Prelude.FilePath.

那么应该如何将 Turtle.FilePath 变成 BL.readFile

我正在使用堆栈解析器 LTS-9.9,如果这有区别的话。

我确实碰巧从 this blog 中找到了一些有用的东西。

import Filesystem.Path.CurrentOS as Path

filePathToString :: FilePath -> String
filePathToString = Path.encodeString

现在我可以打电话了

csvData <- BL.readFile $ filePathToString fname

并且有效。如果有人知道更简单的方法,请发表评论!

不直接使用也可以进行转换system-filepath:

import qualified Data.Text as T

filePathToString :: FilePath -> String
filePathToString = T.unpack . format fp