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

では、Rid of the Right を取得して実際にリストを使用するにはどうすればよいでしょうか。

*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

後でエラーを保持したいが、結果で何かをしたい場合は、代わりにEitherFunctor (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 に答える