你好,我想问问haskeller的人,如果您有一长串纯方法,如何才能有效地调试haskell程序。例如:
do
a<-impure
(pure a) # where pure calls pure1->pure2->pure2
如果所有内容都不是IO
,那么该如何调试调用栈中的所有内容,因此我无法在任何地方print
或writeFile
进行大量工作?
haskell研究员只是将所有签名更改为IO something
来查看代码崩溃的地方?
具体示例
主要
module Main where
import Data.Text(Text,pack,unpack)
import Data.Text.IO(readFile,writeFile)
import TCPFile(TCPFile)
import TCPEncoding(toText,fromText)
main::IO()
main=do
dat<-readTcpFile "test.txt"
print dat
writeTcpFile "output.txt" dat
writeTcpFile::FilePath->TCPFile->IO()
writeTcpFile path file=Data.Text.IO.writeFile path (toText file)
readTcpFile::FilePath->IO TCPFile
readTcpFile path =fromText <$> Data.Text.IO.readFile path
module TCPEncoding where
import Data.Text
class TextEncode a where
toText::a-> Text
fromText::Text-> a
我不会编写方法的整个层次结构,我只想知道如何运行程序直到特定的一行并获取变量值和堆栈框架。
对于该程序,我最后用writeTcpFile
写到文件中的全部是:
main: <<loop>>
那么如何调试fromText
内部使用的readTcpFile
方法及其内部?
答案 0 :(得分:1)
如前所述,我倾向于使用trace
trace :: String -> a -> a
,因此它需要一个String
和一个值,并返回与id
相同的值。它会在您要使用它的时候被触发,所以对您来说:
main = do
dat <- readTcpFile "test.txt"
_ <- trace "write what you want to see in console" dat
writeTcpFile "output.txt" dat
如果要跟踪dat
的值,则必须确保将其转换为String
。
同样在do块中,它已绑定到_
,所以它没有任何副作用。