Haskell:如何从Right中提取值

时间:2018-07-10 06:33:00

标签: haskell

我正在构建一个简单的脚本来分析每行两个项目的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")]

我该怎么做?

2 个答案:

答案 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数据构造函数中解包数据。

例如,您可以编写一个处理LeftRight情况的函数,因为通常最好实现 total 函数(可以处理整个函数的函数)。类型指定的值的空间)。