2017-10-17 28 views
0

我想用Haskell Turtle做一些CSV文件处理,但是我在使用选项解析器中的Turtle.FilePath时遇到了问题。 下面是一个exampple:使用Haskell Turtle的FilePath和readFile

{-# 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.FilePathBL.readFile

我使用堆栈解析器LTS-9.9,如果这有所作为。

回答

1

的转化也不直接使用system-filepath进行:

import qualified Data.Text as T 

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

我碰巧找到从this blog起作用的东西。现在

import Filesystem.Path.CurrentOS as Path 

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

我可以叫

csvData <- BL.readFile $ filePathToString fname 

和它的作品。如果有人知道更多的这种做法,请评论!