调试纯方法链

时间:2018-11-06 15:40:26

标签: debugging haskell

你好,我想问问haskeller的人,如果您有一长串纯方法,如何才能有效地调试haskell程序。例如:

do
  a<-impure
  (pure a)  # where pure calls pure1->pure2->pure2 

如果所有内容都不是IO,那么该如何调试调用栈中的所有内容,因此我无法在任何地方printwriteFile进行大量工作?
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方法及其内部?

1 个答案:

答案 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块中,它已绑定到_,所以它没有任何副作用。