首页 > 解决方案 > Haskell:如何从 Right 中提取值

问题描述

我正在构建一个简单的脚本来解析每行两个项目的 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中,以便我可以使用它。IE:

*Main> let df = <something here> v
*Main> df
[("1","2"),("3","4")]

我怎么做?

标签: haskell

解决方案


您可以在此处使用模式匹配逻辑。例如:

let Right df = v

因此,我们在这里将数据从Right数据构造函数中解包出来。

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


推荐阅读