列表理解并将字符串转换为对象
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。使用像 parsec
、attoparsec
甚至像 regex-applicative
.
这样的超级简单的东西会更好
我有一个字符串,例如 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。使用像 parsec
、attoparsec
甚至像 regex-applicative
.