Debugging 调试haskell中的错误消息

Debugging 调试haskell中的错误消息,debugging,haskell,Debugging,Haskell,您好,我在Haskell程序中遇到此错误消息,我不知道循环来自何处。几乎没有IO方法,因此我可以将自己与它们挂钩并在终端中打印部分结果 我从一个文件开始,读取它,然后只有纯方法。我如何调试它 是否有方法附加到方法或创建可以执行以下操作的帮助器: 有一个方法::a->b我怎么能把它包装成iomethod::a->b->IO a->b,以便能够在GHCI中进行测试我想插入一些putStrLn-s等 另外,我的数据经历了IO a->b->c->d->……->IO x的转换,我不知道如何调试parath

您好,我在Haskell程序中遇到此错误消息,我不知道循环来自何处。几乎没有IO方法,因此我可以将自己与它们挂钩并在终端中打印部分结果

我从一个文件开始,读取它,然后只有纯方法。我如何调试它

是否有方法附加到方法或创建可以执行以下操作的帮助器:

有一个方法::a->b我怎么能把它包装成iomethod::a->b->IO a->b,以便能够在GHCI中进行测试我想插入一些putStrLn-s等

另外,我的数据经历了IO a->b->c->d->……->IO x的转换,我不知道如何调试parathesis中的部分,即包含纯方法的代码

类型和类型类定义和实现

主要

我想首先从给定的字符中清除文本,在我们的例子中是}{,然后将其拆分为,。在文本被逗号拆分后,我想解析它们,并创建一个包含6个整数的Rfile,或者创建一个包含任意给定数目的整数的Dfile数据文件

输入 我有一个包含以下内容的文件:r,1.22,3.45,6.66,5.55,6.33,2.32},我正在运行runghc main 2>err.hs

预期输出:Rfile Just Readme 1.22 3.45 6.66 5.55 6.33 2.32在textcode Readme实例中,len和dat相互依赖:

instance TextEncode Readme where
    fromText txt =let len= length dat
                      dat= case len of 

要调试这类代码,除了盯着代码,您可以做的一件事是使用-prof-fprof auto-rtsopts进行编译,并使用cmd行选项+RTS-xc运行程序。当引发异常或程序循环时,当您按Ctrl+C组合键终止异常时,这应该打印一个跟踪。请参阅GHC手册,正如李耀霞所说,部分问题是无限递归,但如果您尝试了以下代码,那么问题仍然存在

instance TextEncode Readme where
    fromText txt =let len= length [1,2,3,4,5,6] --dat
                      dat= case len of 
第二个问题是,该文件包含十进制数,但所有转换函数都预期可能是Int,更改以下函数的定义应该会得到预期的结果,另一方面,正确的修复方法可能是该文件应该包含整数,而不是十进制数

readData::Text->[Double]
--readData xs = [1,2,3,4,5,6,6]
readData =catMaybes . maybeValues where
    maybeValues = mvalues . split . filterText "{}"

--all the methods under this line  are used in the above method

mvalues::[Text]->[Maybe Double]
mvalues arr=map (\x->(readMaybe::String->Maybe Double).unpack $ x) arr

data Readme=Readme{ maxClients::Double, minClients::Double,stepClients::Double,maxDelay::Double,minDelay::Double,stepDelay::Double}deriving(Show)

请共享相关代码您可以尝试使用Debug.Trace进行类似printf的调试,而无需输入所有内容。您的代码很难阅读,因为格式很难且不一致;你有很多似乎没有意义的功能;不完全实例;而且它是如此混乱以至于不清楚应该发生什么。我看不到一个明显的地方,你得到的错误。您可以尝试的另一件事是在ghci中运行/测试小部件。您不需要定义>>?;您可以直接使用>>=来调试这类代码,而不是盯着代码看,您可以做的一件事是使用-prof-fprof auto-rtsopts进行编译,并使用cmd行选项+RTS-xc运行程序。当引发异常或程序循环时,当您终止异常时,这应该打印一个跟踪Ctrl+C。请参阅GHC手册
instance TextEncode Readme where
    fromText txt =let len= length [1,2,3,4,5,6] --dat
                      dat= case len of 
readData::Text->[Double]
--readData xs = [1,2,3,4,5,6,6]
readData =catMaybes . maybeValues where
    maybeValues = mvalues . split . filterText "{}"

--all the methods under this line  are used in the above method

mvalues::[Text]->[Maybe Double]
mvalues arr=map (\x->(readMaybe::String->Maybe Double).unpack $ x) arr

data Readme=Readme{ maxClients::Double, minClients::Double,stepClients::Double,maxDelay::Double,minDelay::Double,stepDelay::Double}deriving(Show)