我正在构建一个简单的脚本来分析每行两个项目的CSV文件:
//Main.hs
module Main where
import qualified Data.ByteString.Lazy as BL
import qualified Data.Vector as V
import Data.Csv
type Row = (BL.ByteString, BL.ByteString)
main :: IO ()
main = do
csvData <- BL.readFile "csvs/twostringsperrow.csv"
let v = decode NoHeader csvData :: Either String (V.Vector Row)
putStrLn "All done"
该脚本有效。显然,目前它并没有做什么用,但确实有效,这令人放心。
我现在想在GHCi中与之交互,所以我运行了这两行:
$ stack ghci
...
*Main> csvData <- BL.readFile "csvs/twostringsperrow.csv"
*Main> let v = decode NoHeader csvData :: Either String (V.Vector Row)
*Main> v
Right [("1","2"),("3","4")]
在这一点上,我可以看到解析已成功完成,并且希望将[("1","2"),("3","4")]
中的Right
放入名为df
的变量中,这样我就可以玩了用它。即:
*Main> let df = <something here> v
*Main> df
[("1","2"),("3","4")]
我该怎么做?
答案 0 :(得分:3)
使用case
的基本方法。
do ...
x <- parse ...
case x of
Left e -> putStrLn ("Parse error" ++ show e)
Right y -> putStrLn ("Parse OK!" ++ show y)
请不要忘记,通常我们不能以安全的方式“删除Right
”,因为类型Either ParseError T
的值不一定是Right
,而是也可以是Left
。
实际上,解析库返回这种求和类型以迫使我们处理错误,并考虑两种情况。
确实存在一些危险的分函数“删除Right
”,但最好避免使用它们。
答案 1 :(得分:2)
您可以在此处使用模式匹配逻辑。例如:
let Right df = v
因此,我们在这里从Right
数据构造函数中解包数据。
例如,您可以编写一个处理Left
和Right
情况的函数,因为通常最好实现 total 函数(可以处理整个函数的函数)。类型指定的值的空间)。