给定以下程序,我在处理单子时遇到了问题。
csv_data是一种“Either(parseerror) CSV”类型,而printCSV只接受CSV数据。
这是工作版本和损坏版本之间的差异。
参考资料:http://hackage.haskell.org/packages/archive/csv/0.1.2/doc/html/Text-CSV.html
module Main
where
import System.Environment
import System.Directory
import System.IO
import Text.CSV
--------------------------------------------------
exister :: String -> IO Bool
exister path = do
fileexist <- doesFileExist path
direxist <- doesDirectoryExist path
return (fileexist || direxist )
--------------------------------------------------
slurp :: String -> IO String
slurp path = do
withFile path ReadMode (\handle -> do
contents <- hGetContents handle
last contents `seq` return contents )
--------------------------------------------------
main :: IO ()
main = do
[csv_filename] <- getArgs
putStrLn (show csv_filename)
csv_raw <- slurp csv_filename
let csv_data = parseCSV csv_filename csv_raw
printCSV csv_data -- unable to compile.
csv_data是一种“Either(parseerror) CSV”类型,而printCSV只接受CSV数据。
这是工作版本和损坏版本之间的差异。
***************
*** 27,30 ****
csv_raw <- slurp csv_filename
let csv_data = parseCSV csv_filename csv_raw
! printCSV csv_data -- unable to compile.
\ No newline at end of file
--- 27,35 ----
csv_raw <- slurp csv_filename
let csv_data = parseCSV csv_filename csv_raw
! case csv_data of
! Left error -> putStrLn $ show error
! Right csv_data -> putStrLn $ printCSV csv_data
!
! putStrLn "done"
!
参考资料:http://hackage.haskell.org/packages/archive/csv/0.1.2/doc/html/Text-CSV.html
printCSV :: CSV -> String
这个函数名不够好吗?它是一个纯函数,而不是一个IO类型的函数。如果我在最后一行写putStrLn $ printCSV csv_data
,那么它就可以编译了。 - applicative