4

我正在尝试读取一些示例成功的 CSV 文件。这是我所拥有的

*Main System.IO> let result=parseCSV contents
*Main System.IO> result
Right [["Name","Value","Amount"],["Rob","1","10"],["Bob","1.42","15.3"],["Tom","452.2","23.1"]]

但是如果我尝试从这个数组中读取值,我会得到一个错误

*Main System.IO> head result

<interactive>:21:6:
    Couldn't match expected type `[a0]'
            with actual type `Either ParseError [[String]]'
In the first argument of `head', namely `result'
In the expression: head result
In an equation for `it': it = head result

那么我怎样才能摆脱权利并实际使用列表呢?

*Main System.IO> :t result
result :: Either ParseError [[String]]
4

3 回答 3

3

要摆脱Right,您需要决定在出现错误时该怎么做。如果你只想得到一个空的结果,你可以使用:

justTheResult :: [[[Char]]]
justTheResult = either (const []) id result

如果要引发错误,可以使用:

justTheResult :: [[[Char]]]
justTheResult = either (const $ error "Couldn't parse CSV") id result

如果您想稍后保留错误,但对结果做一些事情,您可以改用Either'sFunctor (Either e)实例:

errorOrNumberOfRows :: Either ParseError Int
errorOrNumberOfRows = fmap length result

现在您将在同一个地方访问该Int长度

于 2013-11-07T15:04:34.227 回答
1

将其更改为

*Main System.IO> let (Right result) = parseCSV contents
*Main System.IO> head result
于 2013-11-07T15:01:55.377 回答
1

如果您真的想忽略该错误,请执行以下操作:

either (const []) id (parseCSV contents)

如果出现解析错误,它将为您提供一个空列表。

于 2013-11-07T15:02:37.213 回答