Haskell 列表理解和将字符串转换为对象
我有一个字符串,比如Haskell 列表理解和将字符串转换为对象,haskell,converter,Haskell,Converter,我有一个字符串,比如2.7+I*3.4。我想解析这个字符串并得到复数对象。我尝试这样做: newtype MyComplexNumber = MyComplexNumber (Complex Float) myReadsCmplx s = [(MyComplexNumber (a :+ b)) | (a, '+':r1) <- reads s :: [(Float, String)],
2.7+I*3.4
。我想解析这个字符串并得到复数
对象。我尝试这样做:
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)]]
您似乎在使用
读取
,就好像它是一个完整的一元语法分析器一样。不是。它会找到一个匹配项或无匹配项,如果它找到的匹配项与您的模式不匹配,则您将获得nada。使用parsec
,attoprasec
,或者甚至是像regex applicative
这样的超级简单的东西,你会感觉好多了。你正在读一个字符串i
:读一个字符串需要像读“\”i\”
这样的引号,因此它失败了。@chi,hm,如何解决此问题?您可以像处理+
一样删除这些字符,例如(a,“+”:“I”:“*”:r1)或ghc实际用于实现读取的(cf.)@d8d0d65b3f7cf42,是的,这看起来是另一个不错的选择。有很多好的选择。@dfeuer,谢谢你的回答。你说“你得到了娜达”是什么意思?
*Main Data.Complex> myReadsCmplx "2.7+i*3.4"
[]
*Main Data.Complex>