Parsing 处理列表的无读分析错误

Parsing 处理列表的无读分析错误,parsing,haskell,maybe,Parsing,Haskell,Maybe,您好,有人能告诉我,当在列表中执行时,如何处理Haskell中失败的计算(在我们的例子中是parsings),检索成功的元素 我得到的错误是 main:Prelude.read:no parse这会停止处理所有列表 我在文本集合上使用表单,对于每个元素,我使用读取::字符串->双精度作为结果值。 目前,第一个元素的解析失败,我无法解析其余的元素。如何使单个元素“可失败”,但仍然得到部分结果(对于可以解析的列表元素) 示例:输入:[“asta”、“1.23”、“2.44”] 所需输出:[1.23,

您好,有人能告诉我,当在列表中执行时,如何处理Haskell中失败的计算(在我们的例子中是parsings),检索成功的元素

我得到的错误是
main:Prelude.read:no parse
这会停止处理所有列表

我在
文本集合上使用
表单
,对于每个元素,我使用
读取::字符串->双精度
作为结果值。

目前,第一个元素的解析失败,我无法解析其余的元素。如何使单个元素“可失败”,但仍然得到部分结果(对于可以解析的列表元素)

示例
输入
[“asta”、“1.23”、“2.44”]

所需输出
[1.23,2.44]

import qualified Data.Text as T

parseDfile::[T.Text]->IO [Maybe Double]
    parseDfile []=do
        return  [Nothing]
    parseDfile lines = forM lines $ \line ->
                          do   
                          Prelude.putStrLn ("line value:"++(T.unpack line))
                          let value = (read::String->Double) . T.unpack $ //fails here  for first element 
                          print .show $ value
                          return (Just value)

p.S
我是否必须为这一行代码单独定义一个使用
Maybe
单子的方法?

文本。Read
库还有一个名为
readMaybe
的函数,它返回一个
Maybe
而不是像
Read
那样的
单子

如果您不确定字符串是否可以被解析,那么您显然需要一个
或者一个
。现在您需要处理
Maybe
了,但是
Maybe
monad有大量的函数,可以完全满足您的需要

对于更复杂的解析,您可以查看Haskell ParseLib,它非常好。然而,如果您不尝试解析比您的示例更多的内容,那么这可能有点过头了