使用 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
我正在尝试使用 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