Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 列表理解和将字符串转换为对象_Haskell_Converter - Fatal编程技术网

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>