0

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

4

2 回答 2

2

也可以在不直接使用的情况下执行转换system-filepath

import qualified Data.Text as T

filePathToString :: FilePath -> String
filePathToString = T.unpack . format fp
于 2017-10-25T21:39:51.810 回答
0

我确实碰巧从这个博客中找到了一些有用的东西。

import Filesystem.Path.CurrentOS as Path

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

现在我可以打电话了

csvData <- BL.readFile $ filePathToString fname

它有效。如果有人知道这样做的更惯用的方式,请发表评论!

于 2017-10-17T17:14:25.873 回答