
I have the following code: $$$$$$$$ module Main where import System.Environment (getArgs) import Text.CSV.ByteString import qualified Data.ByteString.Lazy.Char8 as L main = do [args] <- getArgs file <- L.readFile args let result = parseCSV file case result of Nothing -> putStrLn "Error when parsing!" Just contents -> do putStrLn "parsing OK!" -- map_header_records contents $$$$$$$$ which yielded the error as follows: Couldn't match expected type `Data.ByteString.Internal.ByteString' against inferred type `L.ByteString' In the first argument of `parseCSV', namely `file' In the expression: parseCSV file In the definition of `result': result = parseCSV file readFile in the Data.ByteString.Lazy.Char8 module returns ByteString type. Since the module is qualified as L, L.readFile returns L.ByteString. But parseCSV expects a ByteString. Sometimes this is annoying, because it makes type matching difficult (at least for me, a beginner). I really wish Haskell can intelligently treat L.ByteString, M.ByteString, and whatever X.ByteString the same as ByteString, and match them. Can someone tell me how to solve the above problem? Thanks, Hong

My mistake. I did not read the Text.CSV.ByteString document carefully.
parseCSV requires a strict ByteString, but I was feeding a lazy one.
Have a good weekend!
Hong
On Fri, Nov 6, 2009 at 3:47 PM, Hong Yang
I have the following code:
$$$$$$$$ module Main where
import System.Environment (getArgs) import Text.CSV.ByteString import qualified Data.ByteString.Lazy.Char8 as L
main = do [args] <- getArgs file <- L.readFile args let result = parseCSV file case result of Nothing -> putStrLn "Error when parsing!" Just contents -> do putStrLn "parsing OK!" -- map_header_records contents $$$$$$$$
which yielded the error as follows:
Couldn't match expected type `Data.ByteString.Internal.ByteString' against inferred type `L.ByteString' In the first argument of `parseCSV', namely `file' In the expression: parseCSV file In the definition of `result': result = parseCSV file
readFile in the Data.ByteString.Lazy.Char8 module returns ByteString type. Since the module is qualified as L, L.readFile returns L.ByteString. But parseCSV expects a ByteString. Sometimes this is annoying, because it makes type matching difficult (at least for me, a beginner). I really wish Haskell can intelligently treat L.ByteString, M.ByteString, and whatever X.ByteString the same as ByteString, and match them.
Can someone tell me how to solve the above problem?
Thanks,
Hong
participants (1)
-
Hong Yang