使用Haskell Turtle的FilePath和readFile

时间:2017-10-17 15:23:25

标签: haskell haskell-turtle

我正在尝试使用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,如果这有所不同。

2 个答案:

答案 0 :(得分:2)

转换也可以在不直接使用system-filepath

的情况下执行
import qualified Data.Text as T

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

答案 1 :(得分:0)

我碰巧找到了一些可以从this blog起作用的东西。

{{1}}

现在我可以致电

{{1}}

它有效。如果有人知道这样做的比较方法,请发表评论!