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

List comprehension and converting string to object

我有一个字符串,例如 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>

您似乎在使用 reads,就好像它是一个完整的单子解析器一样。不是。它会给出一个匹配项或 none,如果它找到的匹配项与您的模式不匹配,您将得到 nada。使用像 parsecattoparsec 甚至像 regex-applicative.

这样的超级简单的东西会更好