列表理解并将字符串转换为对象

时间:2015-03-21 16:24:59

标签: haskell converter

我有一个字符串,例如2.7+i*3.4。我想解析这个字符串并得到Complex number对象。我试着这样做:

newtype MyComplexNumber = MyComplexNumber (Complex Float)

myReadsCmplx s = [(MyComplexNumber (a :+ b)) |
                               (a, '+':r1) <- reads s :: [(Float, String)],
                               (i, '*':r2) <- reads r1 :: [(String, String)],
                               (b, r3) <- reads r2 :: [(Float, String)]]

但我有空列表:

*Main Data.Complex> myReadsCmplx "2.7+i*3.4"
[]
*Main Data.Complex>

1 个答案:

答案 0 :(得分:1)

您似乎正在使用reads,就像它是一个完整的monadic解析器一样。不是。它会出现一个匹配或没有匹配,如果它找到的匹配与你的模式不匹配,你会得到nada。使用parsecattoparsec或甚至像regex-applicative这样超简单的东西,你会好得多。